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)
那不是我想要的。
既然您写了“或类似”,那么假设您想像这样调用该程序:
\n$ my_program -i arg1 -o arg2\nRun Code Online (Sandbox Code Playgroud)\n这个就更短了。这也是我们对无处不在的 Python 工具(如pip. 并且有一个既定的过程来为任何 Python 包定义“入口点”(众所周知)。
所有 Python 打包工具都允许这样做。如果我们想要 \xe2\x80\x94 这就是Pip 所做的,我们可以使用经典的安装工具。或者使用 Poetry,一种更现代的选择。但使用Flit通常最容易设置。
\n在最简单的情况下,您的包my_program仅包含一个__init__.py定义函数的文件:
$ my_program -i arg1 -o arg2\nRun Code Online (Sandbox Code Playgroud)\n该函数通常作用于sys.argv. 该函数不必被调用main,它可以是任何名称,也可以位于包的任何其他模块中。
然后,我们可以在项目的元数据中定义控制台脚本的入口点。pyproject.tomlFlit 从根文件夹中命名的配置文件中读取该信息。所以存储库现在看起来像这样:
def main():\n print(\'Running my program...\')\nRun Code Online (Sandbox Code Playgroud)\n使用最新的元数据标准PEP 621将pyproject.toml包含:
[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\'\nRun Code Online (Sandbox Code Playgroud)\n在[ project.scripts] 部分中,我们将控制台命令映射my_program到包main的顶级名称空间中的函数my_program。同样,它也可以是包中其他地方的任何其他函数。
现在我们打包项目:
\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\nRun Code Online (Sandbox Code Playgroud)\n这会将打包的“wheel”放入名为 的文件夹中dist。我们可以将该.whl文件上传到PyPI进行分发,或者立即使用 Pip 安装它:
$ 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\nRun Code Online (Sandbox Code Playgroud)\n现在我们可以像任何其他控制台应用程序一样运行该程序:
\n$ my_program\nRunning my program...\nRun Code Online (Sandbox Code Playgroud)\nPip 为我们所做的是,它在自己的启动器旁边为我们的包创建了一个小型启动器。就像对弗利特所做的那样。例如,在 Windows 上,现在有一个my_program.exe内部 Python文件夹,就在和Scripts旁边。pip.exeflit.exe