2012-06-04 199 views
1

在下面的代碼片段(意味着在init.d環境中工作)我想執行test.ClassPath。但是,我在設置和傳遞用戶的.bashrc中定義的CLASSPATH環境變量時遇到了問題。Python和環境變量

這裏是我沮喪的來源:

  • 當以下腳本在使用模式下運行,它打印出的CLASSPATH OK(由$ HOME/.bashrc中)
  • ,當我運行它它也顯示CLASSPATH罰款(我已經設置了CLASSPATH的/etc/bash.bashrc)
  • 但是當我做「sudo script.py」(模擬init.d啓動時發生了什麼),CLASSPATH不見了 !!

的CLASSPATH是相當大的,所以我想從文件中讀取它..比如$ HOME /的.classpath

#!/usr/bin/python 
import subprocess 
import os.path as osp 
import os 

user = "USERNAME" 
logDir = "/home/USERNAME/temp/" 
print os.environ["HOME"] 

if "CLASSPATH" in os.environ: 
     print os.environ["CLASSPATH"] 
else: 
     print "Missing CLASSPATH" 
procLog = open(osp.join(logDir, 'test.log'), 'w') 
cmdStr = 'sudo -u %s -i java test.ClassPath'%(user,) # run in user 
proc = subprocess.Popen(cmdStr, shell=True, bufsize=0, stderr=procLog, stdout=procLog) 
procLog.close() 

回答

1

在啓動python腳本來獲取環境變量設置之前,您可以將source ~/.bashrc

4

sudo默認不會通過環境變量。從手冊頁:

By default, the env_reset option is enabled. This causes 
    commands to be executed with a minimal environment containing 
    TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER and USERNAME in 
    addition to variables from the invoking process permitted by 
    the env_check and env_keep options. This is effectively a 
    whitelist for environment variables. 

有幾種解決方法。

  1. 您可以編輯/etc/sudoers使用env_keep配置指令明確地傳遞CLASSPATH 變量。這可能 看起來像:

    Defaults env_keep += "CLASSPATH" 
    
  2. 可以使用env命令,它可以讓你明確地設置環境中運行命令。一個典型的命令行調用可能是這樣的:

    sudo env CLASSPATH=/path1:/path2 java test.ClassPath 
    

的明顯優勢選項(2)是它不需要擺弄的sudoers配置。

+0

我在調用腳本來模擬init.d調用這個腳本時發生了什麼的時候,我會sudo。那麼,我如何在init.d時間使用這個想法呢? – fodon

+0

我不確定我瞭解你的問題。我建議如何使用'env'命令使現有的腳本工作。我*認爲*這將做你想做的。如果這不符合您的要求,請更新您的問題(而不是將其變成一個巨大的評論主題),以表明您想要的行爲與您使用此建議的行爲不同。 – larsks