分发python应用程序

paf*_*fcu 0 python setuptools

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

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

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

我现在想要分发这个程序,我想我会使用setuptools来完成它.用户预计将使用的文件是main.py,这样一个显然已经到/ usr/bin和文件的剩余部分进入到/ usr /共享/项目.

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

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

mg.*_*mg. 11

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

import project
Run Code Online (Sandbox Code Playgroud)

当您进行相对导入而不是绝对导入时,问题会增加.如果您的main.py导入config.py工作,因为它们位于同一目录中.当您移动main.py到像另一个位置/usr/bin或存在于另一个位置PATH环境变量,蟒蛇试图导入config.pysys.path,而不是从你的包目录.解决方案是使用绝对导入:

from project import config
Run Code Online (Sandbox Code Playgroud)

现在main.py是"可移动的".

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

而不是让你的代码

if __name__ == "__main__":
    # here all your beautiful code
Run Code Online (Sandbox Code Playgroud)

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

def main():
    # put your code here

if __name__ == "__main__":    # not needed, just in case...
    main()
Run Code Online (Sandbox Code Playgroud)

现在修改你的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",
        ],
    }
)
Run Code Online (Sandbox Code Playgroud)

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

ES.

python setup.py install --prefix ~/.local
Run Code Online (Sandbox Code Playgroud)

安装您的项目包

~/.local/lib/python<version>/site-packages/<package_name>
Run Code Online (Sandbox Code Playgroud)

和你的脚本

~/.local/bin/<script_name>
Run Code Online (Sandbox Code Playgroud)

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

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