我有一个简单的python应用程序,其目录结构如下:
Config.py仅加载配置文件,它本身不包含任何配置信息。
我现在想分发这个程序,我想我会使用setuptools来完成它。预期用户使用的文件是main.py,因此一个明确进入/ usr / bin,其余文件进入/ usr / share / project。
但是有一个问题:我会以某种方式告诉main.py在共享目录中查找config.py.但我无法确定共享目录的确切位置,因为这取决于setuptools,对吗?
分发基于Python的应用程序时的最佳做法是什么?
答案 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