Luc*_*cas 13 python argparse python-poetry
诗歌文档说,脚本部分可用于在安装包时安装脚本或可执行文件。但它没有显示任何如何将参数传递给脚本的示例。
如何接收argparse函数中的参数?
Luc*_*cas 17
首先是一些项目设置:
\n从一个新的诗歌项目开始poetry new example_script(并在目录中创建一个main.py文件example_script),其结构如下:
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 example_script\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.rst\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_poetry_example.py\nRun Code Online (Sandbox Code Playgroud)\n并添加我们要安装的脚本的pyproject.toml配置(在部分中):[tool.poetry.scripts]
# pyproject.toml\n\n[tool.poetry]\nname = "example_script"\n\n# some lines excluded\n\n[tool.poetry.scripts]\nmy-script = "example_script.main:start"\n\n# some lines excluded\nRun Code Online (Sandbox Code Playgroud)\n最后是main.py文件,其中必须有一个start函数(正如我们在 toml 中传递的那样)。参数解析器位于该函数内部,因为该函数是我们运行脚本时最终执行的函数:
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 example_script\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.rst\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_poetry_example.py\nRun Code Online (Sandbox Code Playgroud)\n我们可以用诗歌来运行脚本,或者直接安装并运行它:
\n# pyproject.toml\n\n[tool.poetry]\nname = "example_script"\n\n# some lines excluded\n\n[tool.poetry.scripts]\nmy-script = "example_script.main:start"\n\n# some lines excluded\nRun Code Online (Sandbox Code Playgroud)\n
这个问题实际上是两个独立的问题:
最初的答案(由卢卡斯)解决了每个问题的一部分,特别是关于 argparse 的问题,但我回答是为了填写一些额外的细节并解释如何直接访问参数。
作为 argparse 的替代方案,可以随时使用 Python 直接访问参数sys.argv,它是一个字符串列表,每个字符串都是参数之一。Python 根据空格分割参数,除非空格用引号(单引号或双引号)括起来。
这个方法比argparse更直接、更轻量,功能也少了很多。
args.py设置为主脚本文件,具有以下start()功能:
import sys
def start(args=sys.argv):
for i, arg in enumerate(args):
print(f'Arg #{i}: {arg}')
if __name__ == '__main__':
start()
Run Code Online (Sandbox Code Playgroud)
使用各种参数类型在命令行运行它:
$ python args.py "item 1" 'Hello Arguments!!' "i 3" 4 5 6
Arg #0: args.py
Arg #1: item 1
Arg #2: Hello Arguments!!
Arg #3: i 3
Arg #4: 4
Arg #5: 5
Arg #6: 6
Run Code Online (Sandbox Code Playgroud)
第一个参数始终是被调用的脚本,其调用方式完全相同(即脚本文件或其他引用的相对或绝对路径)。
poetry run虽然您可以通过使用 Poetry 激活虚拟环境,poetry shell然后使用 正常运行脚本来运行 Poetry 脚本python script.py arg1 arg2 arg3,但您也可以直接向命令添加参数poetry run:
在命令行中,直接运行脚本:
$ python args.py "item 1" 'Hello Arguments!!' "i 3" 4 5 6
Arg #0: args.py
Arg #1: item 1
Arg #2: Hello Arguments!!
Arg #3: i 3
Arg #4: 4
Arg #5: 5
Arg #6: 6
Run Code Online (Sandbox Code Playgroud)
或者,将其作为脚本运行,由 Poetry 安装。在这种情况下,我们分配的脚本名称是arg_script,您只需在激活虚拟环境的情况下在终端提示符处直接运行它(即不要使用 python 调用):
在pyproject.toml:
$ poetry run python args.py arg1 arg2 arg3
Arg #0: <some_path>/args.py
Arg #1: arg1
Arg #2: arg2
Arg #3: arg3
Run Code Online (Sandbox Code Playgroud)
更新后pyproject.toml,在终端提示符下运行poetry install以在名为 的虚拟环境中安装脚本arg_script。
借助 Poetry,您可以使用以下命令在虚拟环境中运行命令poetry run:
$ poetry run arg_script arg1 arg2 arg3
Arg #0: arg_script
Arg #1: arg1
Arg #2: arg2
Arg #3: arg3
Run Code Online (Sandbox Code Playgroud)
在 后添加的任何参数poetry run,就像您将它们输入到已激活虚拟环境的终端中一样。即相当于:
[tool.poetry.scripts]
arg_script = 'args:start' # run start() function from ./args.py
Run Code Online (Sandbox Code Playgroud)