【问题标题】:Why are Python environment variables different when executed from a web server?为什么从 Web 服务器执行 Python 环境变量时会有所不同?
【发布时间】:2014-01-24 12:24:31
【问题描述】:

我有以下可执行的 python 脚本:

#!/usr/bin/python

import os
print os.environ

当我以 root 身份从命令行执行它时,我得到以下信息:

{
    'LANG': 'en_US.UTF-8',
    'TERM': 'xterm-256color',
    'SHELL': '/bin/bash',
    'LESSCLOSE': '/usr/bin/lesspipe %s %s',
    'LANGUAGE': 'en_US:en',
    'SHLVL': '1',
    'SSH_TTY': '/dev/pts/0',
    'OLDPWD': '/var/www/bais-mordechai-laravel',
    'COMP_WORDBREAKS': ' \t\n"\'><;|&(:',
    'PWD': '/var/www/bais-mordechai-laravel/public',
    'LESSOPEN': '| /usr/bin/lesspipe %s',
    'SSH_CLIENT': '71.205.188.8 56489 22',
    'LOGNAME': 'root',
    'USER': 'root',
    'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games',
    'MAIL': '/var/mail/root',
    'LS_COLORS':'...',
    'HOME': '/root',
    '_': './pythontest',
    'SSH_CONNECTION': '...'
}

但是当我从一个 php 脚本(在 nginx 服务器上运行)运行它并回显我得到的结果时:

{
    'HOME': '/var/www',
    'PWD': '/var/www/bais-mordechai-laravel/public',
    'USER': 'www-data'
}

为什么它们不同?具体来说,如何让网络版本包含“PATH”变量?

【问题讨论】:

  • 你跑得怎么样了?
  • 什么网络服务器和什么机制(wsgi、fcgi)
  • 它们是不同的,因为 Web 服务器的工作之一是为其运行的脚本设置环境。您的PATH 可能与其他用户的PATH 不同,包括Web 服务器运行脚本的帐户。但是你展示的环境有点稀疏。 CGI 环境会在其中放置更多内容(包括PATH)。也许你所需要的只是确保 PHP 以继承其环境的方式运行脚本,但我不知道,所以我没有回答,对不起。
  • @alKid,这就是我从 php 运行它的方式:echo shell_exec('./pythontest);
  • @Paulo Scardine,我正在使用在 ubuntu 上运行的 nginx。我不确定机制。

标签: php python nginx


【解决方案1】:

对于 apache,请参阅 mod_setenv

此模块允许控制各种 Apache HTTP Server 模块使用的内部环境变量。这些变量也作为本地系统环境变量提供给 CGI 脚本,并可在 SSI 页面中使用。环境变量可以从调用 httpd 进程的 shell 传递。或者,可以在配置过程中设置或取消设置环境变量。

如果您使用的是 Apache 的 FCGId,请参阅 FcgidInitialEnv

使用 FcgidInitialEnv 定义环境变量以传递给 FastCGI 应用程序。该指令可以多次使用。

此设置将应用于为此服务器或虚拟主机生成的所有应用程序。使用 FcgidCmdOptions 将此设置应用于单个应用程序。

对于 Nginx CGI,请参阅 env 设置。

默认情况下,nginx 会移除所有继承自其父进程的环境变量,除了 TZ 变量。该指令允许保留一些继承的变量、更改它们的值或创建新的环境变量。

如果您使用的是 NgxWSGIModule,请参阅 wsgi_var 设置。

指令分配变量,该变量将被添加到 传递给 WSGI 应用程序的环境字典。 可以使用字符串、nginx 变量及其 组合为值。未设置的指令继承自 外层。

如果您在 (gunicorn|tornado|twisted|etc)+supervisord 下运行应用程序,请参阅 environment 指令。

KEY="val",KEY2="val2" 形式的键/值对列表,将放置在 supervisord 进程的环境中(并因此放置在其所有子进程的环境中)。此选项可以包含值 %(here)s,该值扩展为找到 supervisord 配置文件的目录。应引用包含非字母数字字符的值(例如 KEY="val:123",KEY2="val,456")。否则,引用这些值是可选的,但建议使用。请注意,子进程将继承用于启动 supervisord 的 shell 的环境变量,但此处和程序的 environment 选项中覆盖的那些除外。

如果您使用其他东西,请告诉我。

您始终可以使用os.environ 注入环境变量 - 在 (c|fc|ws)gi.py 脚本的开头执行此操作。还请sys.path

sys.path.append('/usr/local/django')

【讨论】:

  • 谢谢,这可能会引导我找到解决方案,但我应该提到我实际上正在运行 nginx 作为我的服务器。我去把它添加到我的问题中。
  • 好的,cmets 延迟了,我在阅读您的回复之前已经回答了。将更新我的答案。
  • 谢谢。但请务必保留有关 apache 的内容,因为它可能对其他人有所帮助。
  • 好吧,如果答案没有涵盖您的部署方式,请使用您的 nginx 配置更新您的问题。
猜你喜欢
  • 2014-09-24
  • 2012-10-08
  • 2014-09-02
  • 1970-01-01
  • 2018-12-03
  • 2016-01-30
  • 2022-10-21
  • 2020-11-16
  • 2020-10-31
相关资源
最近更新 更多