以编程方式确定Bin路径

时间:2014-08-22 16:16:15

标签: python

我正在开发一个名为pj的网络应用,并且有一个bin文件和一个src文件夹。

部署应用程序之前的相对路径如下所示:

pj/binpj/src/pj/script.py

但是,部署后,相对路径将如下所示:

pj_dep/deployed/binpj_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执行此操作,但我对该文件不够熟悉,无法确定要查找的位置。

1 个答案:

答案 0 :(得分:4)

通常,这些目录不会动态找到,但以前已配置

如果您的应用程序只是一个实用程序,则可以有两个配置文件(可能是jsonyaml甚至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"在采购之前。您可以在upstartsupervisorsystemd中设置环境变量,无论您使用何种软件来运行服务器。

请注意,此方法可扩展到您可能需要的任何其他配置,因为大多数配置在开发和生产之间有所不同:SQL地址和登录,API密钥等。