用可执行文件打包Python库
问题内容:
我刚刚完成了一个模块,想打包它。我已经阅读了文档和打包python应用程序的问题,但是当我没有要导入的包而是要启动的脚本时,我不确定如何继续。
该项目如下所示:
Project/
|-- README
|-- requirement.txt
|-- driver.py
|-- run.py
|-- module_1
| |-- __init__.py
| |-- class_1.py
| |-- class_2.py
|-- module 2
|-- |-- __init__.py
|-- |-- class_1.py
|-- |-- class_2.py
为了启动该工具,我要做的是:
python run.py arg1 --option arg2
driver.py
导入所有其他模块并定义一个Driver
类和一些函数。run.py
import
driver.py
,解析参数,设置记录器并一个接一个地调用该函数来完成这项工作。
我不确定的配置setup.py
,是否也需要全局__init__.py
根?据我了解,我将只能import Project
不启动run.py
带有参数的脚本。
从其他阅读资料来看,也许我应该尝试说出这Driver.py
是软件包并使用的entry_points
选项setup()
。但是我不知道如何正确地完成所有这些工作。
谢谢你的热心帮助!
问题答案:
通常,仅当整个项目适合单个模块文件时,才将python软件包作为模块分发。如果您的项目比这更复杂,通常最好将项目构造为带有__init__.py
文件的程序包。这是您的项目转换成包后的样子
Project/
|-- README
|-- requirement.txt
|-- setup.py
|-- scripts/
| |-- driver.py
|-- driver/
| |-- __init__.py
| |-- module_1
| | |-- __init__.py
| | |-- class_1.py
| | |-- class_2.py
| |-- module_2
| |-- |-- __init__.py
| |-- |-- class_1.py
| |-- |-- class_2.py
我将您重命名run.py
为scripts/driver.py
,以前使用的代码driver.py
现在是driver/__init__.py
。
你setup.py
应该看起来像这样
from setuptools import setup. find_packages
setup(
name='driver',
version='1.0',
packages=find_packages(),
scripts=['scripts/driver.py'],
)
这将复制scripts/driver.py
到python
Scripts目录。我重命名为run.py
,driver.py
因为run
它非常通用,并且您希望您的脚本名称是唯一的,因为所有python软件包都共享同一脚本位置。
或者,您可以使用console_scripts
入口点。在这种情况下,您将没有单独的scripts/driver.py
脚本。取而代之的是,您的包中只有一个函数。在这种情况下,您可以将所有代码scripts/driver.py
移入driver/command_line.py
并将其放入称为的函数中main()
。然后将您更改setup.py
为此
setup(
name='driver',
version='1.0',
packages=find_packages(),
entry_points = {
'console_scripts': ['driver=driver.command_line:main'],
}
)
另外,您应该阅读有关python Packaging的此文档页面。它涵盖了基础知识和许多常见用例。