【问题标题】:Using /etc/environment in Python virtualenv在 Python virtualenv 中使用 /etc/environment
【发布时间】:2013-12-30 04:12:04
【问题描述】:

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

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

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

我使用的初始化脚本是

. /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 中定义的变量的正确方法。

【问题讨论】:

    标签: python virtualenv bottle python-daemon


    【解决方案1】:

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

    source /etc/environment
    

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

    【讨论】:

    • 感谢您的回复。我也试过了,但还是一样。它不工作。
    • 你能在激活 virtualenv 后立即做这样的事情吗:pythonwise.blogspot.com/2010/04/sourcing-shell-script.html?
    • 我又发现了一件事。此问题仅在我使用“服务应用程序启动”或“服务应用程序停止”时发生,而在我使用“/etc/init.d/app start”或“/etc/init.d/app stop”时不会发生。
    • 那是因为service 删除了所有非必要的环境变量,以确保初始化脚本在干净的环境中运行。希望这意味着您的问题现在得到了解答!
    • 是的,这就是问题所在。
    【解决方案2】:

    activate 脚本没什么特别的,它只是修改了你的路径。你可以在你的启动器中实现同样的效果:

    . /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
    

    【讨论】:

    • 感谢您的回复。我发现了这个问题。它与初始化脚本无关。就是“服务”命令,去掉所有的环境变量,在最小系统环境下运行脚本。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2012-12-20
      • 2014-07-13
      • 2011-03-20
      相关资源
      最近更新 更多