2017-04-24 43 views
1

根據voithos's answer,os.environ可以設置環境變量和子進程自動從父進程繼承。python在bash中:os.environ的行爲

然而,下面比較例

第一種情況,在python交互模式

>>>import os 
>>>os.environ['a']='1' 
>>>os.system('echo $a') 
1 
0 

結果是好的。

第二種情況,在bash腳本

#!/bin/bash 
python3 - <<EOF 
import os 
os.environ['a']='1' 
os.system('echo $a') 
EOF 

上述保存爲test.bash和運行bash test.bash我們得到了什麼!

爲什麼在第二種情況下,os.system不會繼承變量?


在bash總結

任何美元符號$這裏的文檔將被默認擴大,無論是內部的單引號或沒有。

一種方式是逃避$與反斜線\\$

還有另一種方式來避免這種擴張,即單引號先到這裏文檔分隔符,比較以下

a=0 

python3 - <<here 
import os 
os.environ['a']='1' 
os.system('echo $a') 
here 

python3 - <<'here' 
import os 
os.environ['a']='1' 
os.system('echo $a') 
here 
+0

稍有相關的問題:您的子進程(Python進程)能夠設置**持久**環境變量?我知道NodeJS不允許你設置程序結束後保持的環境變量。 – geostocker

+3

將'os.system('echo $ a')'改爲'os.system('echo \ $ a')' –

+0

它繼承了變量,但是'$ a'必須由於交互性的東西而被評估_before_。我正在使用windows,'echo%a%'yield'1'甚至從bash中運行。 –

回答

1

什麼@ ChristosPapoulas說是對的。 $a在你輸入時正在被shell評估。$a從來沒有讓你的python解釋器。這可以在下面看到:

$ cat >/tmp/foo <<EOF 
> import os 
> os.environ['a'] = '1' 
> os.system('echo $a') 
> EOF 
$ cat /tmp/foo 
import os 
os.environ['a'] = '1' 
os.system('echo ') 
$ 
+0

是的,我們看到了。但是有什麼解決辦法?試着'回聲\ $ a'似乎解決了它,但我無法測試,在窗口上。 –

+0

哦。如果你用文本編輯器編寫實際的python代碼,並將其放在一個文件中,那麼這些都不是問題,因爲你可以把'$'放在文件中。這是可接受的解決方案嗎? –

+0

@ Jean-FrançoisFabre'\ $ a'起作用。我也在窗戶上。但贏10已經在Windows上內置了子linux和bash,所以我可以證實 – user15964