如何打包Python项目在控制台运行

GIO*_*DEZ 1 python packaging python-packaging

我用 Python 编写了一个使用多个脚本(模块)的项目。主脚本调用其他模块并从文件夹中读取一些文件以执行其功能。

我正在尝试将其打包以供分发。我希望使其成为可从命令行运行的程序,这意味着,一旦用户下载并安装它,他们就可以像这样调用该程序:

$ python my_program -i arg1 -o arg2
Run Code Online (Sandbox Code Playgroud)

或类似的。

我在网上找到的教程以可以导入的包的形式包装了项目。

>> import my_program
>> my_program.run_stuff(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)

那不是我想要的。

ano*_*non 6

既然您写了“或类似”,那么假设您想像这样调用该程序:

\n
$ my_program -i arg1 -o arg2\n
Run Code Online (Sandbox Code Playgroud)\n

这个就更短了。这也是我们对无处不在的 Python 工具(如pip. 并且有一个既定的过程来为任何 Python 包定义“入口点”(众所周知)。

\n

所有 Python 打包工具都允许这样做。如果我们想要 \xe2\x80\x94 这就是Pip 所做的,我们可以使用经典的安装工具。或者使用 Poetry,一种更现代的选择。但使用Flit通常最容易设置。

\n

在最简单的情况下,您的包my_program仅包含一个__init__.py定义函数的文件:

\n
$ my_program -i arg1 -o arg2\n
Run Code Online (Sandbox Code Playgroud)\n

该函数通常作用于sys.argv. 该函数不必被调用main,它可以是任何名称,也可以位于包的任何其他模块中。

\n

然后,我们可以在项目的元数据中定义控制台脚本的入口点。pyproject.tomlFlit 从根文件夹中命名的配置文件中读取该信息。所以存储库现在看起来像这样:

\n
def main():\n    print(\'Running my program...\')\n
Run Code Online (Sandbox Code Playgroud)\n

使用最新的元数据标准PEP 621pyproject.toml包含:

\n
[project]\nname = \'my_program\'\nversion = \'1.0.0\'\ndescription = \'Can be run in the console from anywhere.\'\n\n[project.scripts]\nmy_program = \'my_program:main\'\n\n[build-system]\nrequires = [\'flit_core>=3.2,<4\']\nbuild-backend = \'flit_core.buildapi\'\n
Run Code Online (Sandbox Code Playgroud)\n

[ project.scripts] 部分中,我们将控制台命令映射my_program到包main的顶级名称空间中的函数my_program。同样,它也可以是包中其他地方的任何其他函数。

\n

现在我们打包项目:

\n
$ flit build --format wheel\nCopying package file(s) from my_program              I-flit_core.wheel\nWriting metadata files                               I-flit_core.wheel\nWriting the record of files                          I-flit_core.wheel\nBuilt wheel: dist\\my_program-1.0.0-py2.py3-none-any.whl  I-flit_core.wheel\n
Run Code Online (Sandbox Code Playgroud)\n

这会将打包的“wheel”放入名为 的文件夹中dist。我们可以将该.whl文件上传到PyPI进行分发,或者立即使用 Pip 安装它:

\n
$ pip install dist/my_program-1.0.0-py2.py3-none-any.whl\nProcessing .\\dist\\my_program-1.0.0-py2.py3-none-any.whl\nInstalling collected packages: my-program\nSuccessfully installed my-program-1.0.0\n
Run Code Online (Sandbox Code Playgroud)\n

现在我们可以像任何其他控制台应用程序一样运行该程序:

\n
$ my_program\nRunning my program...\n
Run Code Online (Sandbox Code Playgroud)\n

Pip 为我们所做的是,它在自己的启动器旁边为我们的包创建了一个小型启动器。就像对弗利特所做的那样。例如,在 Windows 上,现在有一个my_program.exe内部 Python文件夹,就在和Scripts旁边。pip.exeflit.exe

\n