将命令行参数传递给随 Poetry 安装的 Python 脚本

Luc*_*cas 13 python argparse python-poetry

诗歌文档说,脚本部分可用于在安装包时安装脚本或可执行文件。但它没有显示任何如何将参数传递给脚本的示例。

如何接收argparse函数中的参数?

Luc*_*cas 17

首先是一些项目设置:

\n

从一个新的诗歌项目开始poetry new example_script(并在目录中创建一个main.py文件example_script),其结构如下:

\n
\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\n
Run Code Online (Sandbox Code Playgroud)\n

并添加我们要安装的脚本的pyproject.toml配置(在部分中):[tool.poetry.scripts]

\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\n
Run Code Online (Sandbox Code Playgroud)\n

最后是main.py文件,其中必须有一个start函数(正如我们在 toml 中传递的那样)。参数解析器位于该函数内部,因为该函数是我们运行脚本时最终执行的函数:

\n
\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\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n


Lig*_*tCC 9

这个问题实际上是两个独立的问题:

  1. 如何将参数传递到使用 Poetry 运行的脚本中
  2. 如何访问和解析这些参数,特别是使用 argparse

最初的答案(由卢卡斯)解决了每个问题的一部分,特别是关于 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)

将 python 文件作为已安装的 Poetry 脚本运行

或者,将其作为脚本运行,由 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)