2014-10-30 82 views
16

我在設置環境變量時遇到問題,請致電subprocess.Popen。環境變量似乎沒有被設置。關於如何正確設置Python命令行調用的環境變量的任何建議?Python:在subprocess.Popen中導出環境變量(..)

我的目標是運行使用從我的Python代碼確定的環境變量的腳本:

d = dict(os.environ) 
d["TEST_VARIABLE"] = str(1234) 
subprocess.Popen('/usr/bin/mybinary', env=d).wait() 

但腳本反應彷彿變量從未設置

這裏是我的嘗試測試中,使用Python的交互式解釋:

d = dict(os.environ) 
d["TEST_VARIABLE"] = str(1234) 
subprocess.Popen(['/bin/echo', '$TEST_VARIABLE'], env=d).wait() 

,輸出是:

"$TEST_VARIABLE" 
0 

我認爲env=d應該爲子過程設置環境,但它顯然沒有。有關如何解決此問題的任何建議?

回答

23

在命令行上環境變量的替代是由shell完成,而不是通過/斌/回聲。所以,你需要在shell中運行的命令來獲得替代:

In [22]: subprocess.Popen('/bin/echo $TEST_VARIABLE', shell=True, env=d).wait() 
1234 
Out[22]: 0 

這並不意味着環境變量不是當shell=False,但是設置。即使沒有shell=True,可執行文件也會看到參數env設置的環境變量。

In [23]: subprocess.Popen(["date"], env={'TZ': 'America/New_York'}).wait() 
Wed Oct 29 22:05:52 EDT 2014 
Out[23]: 0 

In [24]: subprocess.Popen(["date"], env={'TZ': 'Asia/Taipei'}).wait() 
Thu Oct 30 10:06:05 CST 2014 
Out[24]: 0 
2

您應該使用os.environ.copy()使其工作。它會創建整個環境字典的副本,然後在將其傳遞到子進程之前可以修改它,而無需修改當前進程環境。

請看看[這裏]:1

+1

的問題是不是環境而是替代,如解釋由接受的答案。 – 2016-08-22 16:11:19

+0

確實如此,但帖子的標題顯示爲「導出」,所以這很有用。 – gerardw 2017-07-31 14:45:38

2

對於Python 3.5和更高版本,可以使用unpacking generalizations,如:例如,dateTZ環境變量影響

env = { 
    **os.environ, 
    "TEST_VARIABLE": str(1234), 
} 
subprocess.Popen('/usr/bin/mybinary', env=env).wait()