使用可执行文件打包Python库

时间:2016-07-15 21:25:35

标签: python packaging setup.py

我刚刚完成了一个模块,想要打包它。我已经阅读了文档和这个问题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类和一些函数。 run.py导入driver.py,解析参数,设置记录器并按其他方式调用函数来完成工作。

我不确定setup.py的配置,还需要根目录下的全局__init__.py吗?根据我的理解,我只能import Project不能使用其参数启动脚本run.py

从其他读物中,我应该尝试告诉Driver.py是包,并使用entry_points的{​​{1}}选项。但我不明白如何正确地完成所有这些工作。

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

通常,当整个项目适合单个模块文件时,您只将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'],
    }
)

另外,您应该阅读this docs page on python packaging。它涵盖了基础知识和许多常见用例。