Python 以编程方式确定Bin路径
我正在开发一个名为pj的web应用程序,其中有一个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目录中查找文件的路径。这导致在开发和部署环境中出现两种不同的行为 如果我这样做Python 以编程方式确定Bin路径,python,Python,我正在开发一个名为pj的web应用程序,其中有一个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
os.path.join(os.path.dirname(__file__), 'bin')
为了尝试获取dev环境的路径,我将为部署环境提供一个不同的路径
是否有一种更通用的方法可以找到bin目录,这样我就不需要依赖if语句来确定基于当前env的目录数量?这似乎不够灵活,并且在以后移动代码时可能会导致其他问题
编辑:我的猜测是,我可能可以使用setup.py执行此操作,但我对该文件不太熟悉,无法确定在何处查找。通常,这些目录不是动态找到的,而是以前配置的 如果您的应用程序只是一个实用程序,那么您可以有两个配置文件,可能是json、yaml,甚至是py文件。在开发过程中使用其中一个文件,并将另一个文件与最终生成捆绑在一起。它们看起来是这样的:
# config.json
{
'path_script': 'foo/pj/lib/script.py'
'path_bin': 'foo/pj/bin'
}
您的程序总是在同一个位置查找config.json:在构建应用程序进行分发时切换文件
如果您的应用程序是一个服务器,最干净的方法是在可源shell文件中使用环境变量。这在virtualenv中非常有效。例如,您可以在项目根目录中包含此环境文件:
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进行开发时,使用sourceenv而不是virtualenv。在生产环境中运行应用程序时,在采购之前导出应用程序_ENV=生产。您可以在upstart、supervisor或systemd中设置环境变量,无论您使用什么软件来运行服务器
请注意,这种方法可以扩展到您可能需要的任何其他配置,因为大多数配置在开发和生产过程中有所不同:SQL地址和登录名、API密钥等。通常,这些目录不是动态找到的,而是以前配置的 如果您的应用程序只是一个实用程序,那么您可以有两个配置文件,可能是json、yaml,甚至是py文件。在开发过程中使用其中一个文件,并将另一个文件与最终生成捆绑在一起。它们看起来是这样的:
# config.json
{
'path_script': 'foo/pj/lib/script.py'
'path_bin': 'foo/pj/bin'
}
您的程序总是在同一个位置查找config.json:在构建应用程序进行分发时切换文件
如果您的应用程序是一个服务器,最干净的方法是在可源shell文件中使用环境变量。这在virtualenv中非常有效。例如,您可以在项目根目录中包含此环境文件:
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进行开发时,使用sourceenv而不是virtualenv。在生产环境中运行应用程序时,在采购之前导出应用程序_ENV=生产。您可以在upstart、supervisor或systemd中设置环境变量,无论您使用什么软件来运行服务器
请注意,这种方法可以扩展到您可能需要的任何其他配置,因为大多数配置在开发和生产过程中会有所不同:SQL地址和登录名、API密钥等