在Python virtualenv中使用/ etc / environment

时间:2013-12-30 04:12:04

标签: python virtualenv bottle python-daemon

我正在开发一个守护程序脚本,它使用python-daemon包启动一个瓶子应用程序。该脚本是/etc/init.d/app.sh

在/ etc / environment中设置了一些环境变量,这些变量将在应用程序的settings.py文件(os.environ)中使用。

一旦我激活virtualenv,就会删除所有系统环境变量(包括我在/ etc / environment中设置的变量)。

我正在使用的init脚本是

. /root/webapps/myapp/bin/activate

case "$1" in
    start)
    echo "Starting server"
    # Start the daemon 
    python /root/webapps/myapp/project/index.py start
    ;;
stop)
    echo "Stopping server"
    # Stop the daemon
    python /root/webapps/myapp/project/index.py stop
    ;;
restart)
    echo "Restarting server"
    python /root/webapps/myapp/project/index.py restart
    ;;
*)
    # Refuse to do other stuff
    echo "Usage: /etc/init.d/app {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

当我检查我在ipython shell中的/ etc / environment中定义的环境变量时,变量显示正常。只有当我尝试使用init脚本启动应用程序时,一切都会变成空白。

我正在寻找的是在virtualenv中的应用程序中使用/ etc / environment中定义的变量的正确方法。

3 个答案:

答案 0 :(得分:0)

尝试将以下内容添加到/etc/init.d/app.sh脚本的顶部:

source /etc/environment

当您使用init脚本启动应用程序时,python应该会看到/etc/environment中设置的任何和所有环境变量。

答案 1 :(得分:0)

激活脚本没什么特别的,它只是修改你的路径。您可以在启动器中实现相同的功能:

. /etc/environment
export PATH=/root/webapps/myapp/bin:$PATH
export VENV_BIN=/root/webapps/myapp/bin
export PROJECT_ROOT=/root/webapps/myapp/project

case "" in
    start)
    echo "Starting server"
    # Start the daemon 
    $VENV_BIN/python $PROJECT_ROOT/index.py start
    ;;
stop)
    echo "Stopping server"
    # Stop the daemon
    $VENV_BIN/python $PROJECT_ROOT/index.py stop
    ;;
restart)
    echo "Restarting server"
    $VENV_BIN/python $PROJECT_ROOT/index.py restart
    ;;
*)
    # Refuse to do other stuff
    echo "Usage: /etc/init.d/app {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

答案 2 :(得分:0)

以下链接提供了有趣的修复方法。我将在某种程度上修改我的应用程序以使其正常工作

https://unix.stackexchange.com/questions/44370/how-to-make-unix-service-see-environment-variables