如何使用模块作为包的一部分和直接可执行的脚本?

Han*_*rst 3 python python-import python-3.x python-packaging

假设我有一个名为 的包文件夹my_package。该目录包含一个名为 的文件__init__.py和一个my_module.py在其他模块文件中被称为的模块文件。该模块my_module.py包含功能do_something_with_file(file_path)

该函数在包的其他部分中使用,但如果可以将其作为命令行脚本调用,将文件路径作为第一个位置参数并执行该函数,那么它将很实用。我的第一个天真的方法是通过以下方式实现:

if __name__ == "__main__":
    import sys
    do_something_with_file(sys.argv[1])
Run Code Online (Sandbox Code Playgroud)

在文件中my_module.py

但这需要作为my_module.pymain 执行。但作为包的一部分,它使用相对导入,仅当模块作为包的一部分执行时才有效,但如果直接执行脚本则失败,这使得这种方法没有吸引力。看来该文件中的主块不是获得所需功能的正确方法。

将功能公开为简单脚本的良好做法是什么?

我没有使用 python 打包的经验,我通常通过执行直接使用脚本python my_script.py,但我想更好地了解包并通过包公开功能。

Arn*_*rne 5

如果您使软件包可安装,则公开脚本入口点效果最佳。我将尝试提供一种或多或少的最小方法来使用 python 本身附带的基本工具来做到这一点,并在最后列出一些第三方包,如果您必须维护它,这将使整个过程变得更加愉快一段时间或最终再写一些脚本。

\n
\n

要使用外部可执行脚本将代码转换为可安装包setuptools以及使代码中的特定函数成为外部可执行脚本,请将setup.py文件添加到目录的顶层,如下所示:

\n
my_project\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80setup.py  # right here, next to your source-code folder\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80my_package\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80__init__.py \n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80my_module.py\n
Run Code Online (Sandbox Code Playgroud)\n

s内容setup.py至少是这样的(在此处检查一些可能对您的项目有意义或可能没有意义的更多可能的关键字):

\n
my_project\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80setup.py  # right here, next to your source-code folder\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80my_package\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80__init__.py \n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80my_module.py\n
Run Code Online (Sandbox Code Playgroud)\n

entry_points与 key 结合的格式\'console_scripts\'为:

\n
[\'my_script=my_package.my_module:do_something_with_file\']\n| |        | \xe2\x94\x94\xe2\x94\x80 this is essentially just a slightly reformatted import of\n| |        |    \'from my_package.my_module import do_something_with_file\'\n| |        \xe2\x94\x94\xe2\x94\x80 this sign starts the parsing of the lookup string for the bound function \n| \xe2\x94\x94\xe2\x94\x80 the name you want to call your script by, can be chosen freely\n\xe2\x94\x94\xe2\x94\x80 a list, since you can install multiple scripts with a single package\n
Run Code Online (Sandbox Code Playgroud)\n

一旦你的设置就位,你就可以pip install -e .在它旁边运行。现在您的代码已作为包安装,并且您的函数已绑定为脚本。my_script location/to/some/file.txt从控制台运行以do_something_with_file使用\'location/to/some/file.txt\'in运行sys.argv[1]

\n
\n

流行的第三方库可以让脚本编写变得更容易,它们是click(相当古老,但因此超级可靠,也是我通常推荐的)和typer(更现代,利用最近的内置 Python 功能,如类型注释)。

\n