我有一个简单的python应用程序,其中我的目录结构如下:
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.py从sys.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