使用可执行文件打包 Python 库
Packaging a Python library with an executable
我刚完成一个模块,想打包它。我已经阅读了文档和这个问题 packaging a python application,但是当我没有要导入的包而是要启动的脚本时,我不确定如何继续。
项目看起来像这样:
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
class 和一些函数。 run.py
导入 driver.py
、解析参数、设置记录器并依次调用函数来完成工作。
我不确定 setup.py
的配置,我还需要在根目录下设置全局 __init__.py
吗?据我了解,我只能 import Project
不启动脚本 run.py
及其参数。
从其他阅读材料来看,也许我应该尝试说明 Driver.py
是包并使用 setup()
的 entry_points
选项。但我不明白如何正确地完成所有这些。
感谢您的热心帮助!
通常,当整个项目适合单个模块文件时,您只分发 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 脚本目录。我将 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'],
}
)
此外,您应该阅读 this docs page on python packaging。它涵盖了基础知识和许多常见用例。
我刚完成一个模块,想打包它。我已经阅读了文档和这个问题 packaging a python application,但是当我没有要导入的包而是要启动的脚本时,我不确定如何继续。
项目看起来像这样:
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
class 和一些函数。 run.py
导入 driver.py
、解析参数、设置记录器并依次调用函数来完成工作。
我不确定 setup.py
的配置,我还需要在根目录下设置全局 __init__.py
吗?据我了解,我只能 import Project
不启动脚本 run.py
及其参数。
从其他阅读材料来看,也许我应该尝试说明 Driver.py
是包并使用 setup()
的 entry_points
选项。但我不明白如何正确地完成所有这些。
感谢您的热心帮助!
通常,当整个项目适合单个模块文件时,您只分发 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 脚本目录。我将 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'],
}
)
此外,您应该阅读 this docs page on python packaging。它涵盖了基础知识和许多常见用例。