分发python应用程序

时间:2010-01-09 20:16:05

标签: python setuptools

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

  • 项目/
    • main.py
    • config.py
    • 插件/
      • plugin1
      • plugin2
      • ...

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

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

但是有一个问题:我会以某种方式告诉main.py在共享目录中查找config.py.但我无法确定共享目录的确切位置,因为这取决于setuptools,对吗?

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

1 个答案:

答案 0 :(得分:11)

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

import project

当您执行相对导入而不是绝对导入时,问题会增加。如果您的main.py导入config.py它可以正常工作,因为它们位于同一目录中。当您将main.py移至/usr/bin PATH 环境变量中的其他位置时,python会尝试从config.py导入sys.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

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