我正在开发一个名为pj
的网络应用,并且有一个bin
文件和一个src
文件夹。
部署应用程序之前的相对路径如下所示:
pj/bin
和pj/src/pj/script.py
。
但是,部署后,相对路径将如下所示:
pj_dep/deployed/bin
和pj_dep/deployed/lib/python2.6/site-packages/pj/script.py
问题:
在script.py
内,我试图找到bin
目录中文件的路径。这会在开发和部署环境中导致两种不同的行为。
如果我这样做
os.path.join(os.path.dirname(__file__), 'bin')
尝试获取开发环境的路径,我将为部署环境提供不同的路径。
是否有更通用的方法可以找到bin目录,这样我就不需要依赖if
语句来确定基于当前环境的目录数量了多少?这似乎不灵活,以后可能会在移动代码时导致其他问题。
编辑:我的猜测是我可以使用setup.py
执行此操作,但我对该文件不够熟悉,无法确定要查找的位置。
答案 0 :(得分:4)
通常,这些目录不会动态找到,但以前已配置。
如果您的应用程序只是一个实用程序,则可以有两个配置文件(可能是json
,yaml
甚至py
个文件。在开发期间使用其中一个文件,并将其他文件与最终版本捆绑在一起。它们看起来像这样:
# config.json
{
'path_script': 'foo/pj/lib/script.py'
'path_bin': 'foo/pj/bin'
}
您的程序始终在同一位置查找config.json
:在构建应用程序以进行分发时切换文件。
如果您的应用程序是服务器,最简洁的方法是在可源的shell文件中使用环境变量。这适用于virtualenv。例如,您可以在项目根目录中包含此env
文件:
source virtualenv/bin/activate
# In the production environment, before sourcing this script, declare `APP_ENV`
if [[ $APP_ENV = "PRODUCTION" ]]; then
export PATH_SCRIPT="foo/pj/lib/script.py"
export PATH_BIN="foo/pj/bin"
else
export PATH_SCRIPT="foo/bar/pj/lib/script.py"
export PATH_BIN="bar/baz/pj/bin"
fi
当你打开一个shell进行开发时,source env
代替你的virtualenv
。在生产中运行应用程序时,export APP_ENV="PRODUCTION"
在采购之前。您可以在upstart
,supervisor
或systemd
中设置环境变量,无论您使用何种软件来运行服务器。
请注意,此方法可扩展到您可能需要的任何其他配置,因为大多数配置在开发和生产之间有所不同:SQL地址和登录,API密钥等。