2014-01-24 32 views
1

我有以下可執行python腳本:從Web服務器執行時,爲什麼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' 
} 

它們爲什麼不同?具體來說,我怎樣才能讓Web版本包含'PATH'變量?

+0

你是如何運行和呼應它? – aIKid

+0

什麼web服務器和什麼機制(wsgi,fcgi) –

+1

他們是不同的,因爲Web服務器的工作之一是爲其運行的腳本設置環境。您的PATH可能與其他用戶的PATH不同,包括Web服務器運行腳本的帳戶。但是你展示的環境是稀疏的。一個CGI環境會把更多的東西放在那裏(包括'PATH')。也許你所需要的只是確保PHP以一種繼承它的環境的方式運行腳本,但我不知道我的回答,對不起。 –

回答

3

對於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)這個值,它擴展到找到supervisord配置文件的目錄。包含非字母數字字符的值應引用(例如,KEY =「val:123」,KEY2 =「val,456」)。否則,引用值是可選的,但建議。請注意,子進程將繼承用於啓動supervisord的shell的環境變量,除了在此處以及在程序環境選項內重寫的外部環境變量。

如果您正在使用別的東西,請告訴我。

您可以始終使用os.environ注入環境變量 - 在您的(c | fc | ws)gi.py腳本開始時執行。 Se也sys.path

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

謝謝,這可能會讓我找到一個解決方案,但我應該提到,我實際上正在運行nginx作爲我的服務器。我去了,並添加到我的問題。 –

+0

好的,評論延遲了,我在閱讀你的回覆之前回答。將更新我的答案。 –

+0

謝謝。但請保留關於apache的東西,因爲它可能會幫助其他人。 –

相關問題