0

我有一个简单的 python 应用程序,我的目录结构如下:

  • 项目/
    • 主文件
    • 配置文件
    • 插件/
      • 插件1
      • 插件2
      • ...

Config.py 只加载配置文件,它本身不包含任何配置信息。

我现在想分发这个程序,我想我会使用 setuptools 来做。预计用户将使用的文件是 main.py,因此其中一个明确进入 /usr/bin,其余文件进入 /usr/share/project。

但是有一个问题:我需要以某种方式告诉 main.py 在共享目录中查找 config.py。但是我不能确定共享目录到底在哪里,因为这取决于 setuptools,对吧?

分发基于 Python 的应用程序时的最佳实践是什么?

4

1 回答 1

11

setuptools将您的软件包安装在可从 python 访问的位置,即您可以导入它:

import project

当您进行相对导入而不是绝对导入时会出现问题。如果您的main.py导入config.py它可以工作,因为它们位于同一目录中。当您将您移动main.py到另一个位置(例如PATH/usr/bin环境变量中存在的另一个位置)时,python 尝试从您的包目录而不是从您的包目录导入。解决方案是使用绝对导入:config.pysys.path

from project import config

现在main.py是“可移动的”。

我更喜欢的另一个解决方案是使用setuptools提供的自动脚本创建。

而不是将您的代码放在

if __name__ == "__main__":
    # here all your beautiful code

声明,将您的代码放在一个函数中(main 可能是一个好名字):

def main():
    # put your code here

if __name__ == "__main__":    # not needed, just in case...
    main()

现在修改你的setup.py

setup(
    # ...
    entry_points = {
        "console_scripts": [
            # modify script_name with the name you want use from shell
            # $ script_name [params]
            "script_name = project.main:main",
        ],
    }
)

就这样。安装后setuptools将创建一个包装脚本,该脚本可从 shell 调用并调用您的 main 函数。现在main.py可以存在于您的项目目录中,您不再需要将其移动到bin/目录中。请注意,setuptools 会自动将此脚本放在bin/与安装前缀相关的目录中。

es。

python setup.py install --prefix ~/.local

将您的项目包安装在

~/.local/lib/python<version>/site-packages/<package_name>

和你的脚本

~/.local/bin/<script_name>

所以请确保它~/.local/bin存在于您的PATH环境中。

更多信息请访问: http: //peak.telecommunity.com/DevCenter/setuptools#automatic-script-creation

于 2010-01-09T21:00:37.037 回答