使用可执行文件打包 Python 库

问题描述 投票:0回答:1

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

我不确定

setup.py
的配置,我还需要在根目录下使用全局
__init__.py
吗?据我所知,我只能
import Project
不启动带有参数的脚本
run.py

从其他阅读中,也许我应该尝试告诉

Driver.py
是包,并使用
entry_points
setup()
选项。但我不明白如何正确地完成这一切。

感谢您的热心帮助!

python packaging setup.py
1个回答
17
投票

通常,只有当整个项目适合单个模块文件时,才将 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 打包的文档页面。它涵盖了基础知识和许多常见用例。

© www.soinside.com 2019 - 2024. All rights reserved.