用executab打包Python库

2021-05-13 13:46:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚完成一个模块,想打包。我已经阅读了文档和这个问题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

为了启动该工具,我需要:

^{pr2}$

driver.py导入所有其他模块并定义Driver类和一些函数。run.py导入driver.py,解析参数,设置记录器,并一个接一个地调用函数来完成任务。在

我不确定setup.py的配置,还需要全局根__init__.py吗?据我所知,我只能执行import Project而不能启动带有参数的脚本run.py。在

从其他阅读资料中,也许我应该试着告诉Driver.py是包,并使用setup()entry_points选项。但我不知道怎么把这些都做好。在

谢谢你的帮助!在

1条回答
网友
1楼 ·

通常,只有当整个项目适合于单个模块文件时,才能将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。在

{cd6}应该是这样的

^{pr2}$

这将把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。它涵盖了基础知识和许多常见用例。在

相关问题