2017-04-20 59 views
1

$貓test.pyPython和Bash命令行env vars的處理方式不同?

#!/usr/bin/env python 
# coding=utf-8 
import os 
print (os.environ.get('test')) 

$測試= 4蟒test.py

4 

$測試= 4;蟒蛇test.py

None 

雖然在外殼我買了蟒蛇不同:

$測試= 4;回聲$測試

4 

但是:

$測試= 2
$測試= 4回聲$測試

2 

所以我感到困惑的Python和bash如何處理這種情況。有人可以解釋嗎?

回答

2

那殼和環境變量之間的區別。

這裏,

test=4 python test.py 

通過test=4python的環境,所以你會得到變量test在腳本中。

test=4; python test.py 

創建一個shell變量,只有在當前shell會話可用(這就是爲什麼你都可以從外殼就好值),即不會被傳播到環境中。

爲了使一個變量的環境變量,使所有的子進程繼承的變量,即讓現有的變量在進程的環境中,任何POSIX外殼通常的方式是export變量:

export test=4; python test.py 

在你的最後一種情況:

$ test=2 
$ test=4 echo $test 
2 

變量test的擴大echo BUI之前發生的事情lt-in運行。

您需要使用一些方法來保持擴張後:

$ test=2 
$ test=4 sh -c 'echo $test' 
4 
+0

最後一種情況如何? – jiamo

+0

@jiamo檢查我的編輯... – heemayl

+0

我可以理解「發生在運行內置回聲之前」。 。爲什麼它不喜歡python將var傳遞給命令的env。 'sh -c'似乎打開了一個像python這樣的新shell。所以解析步驟。看起來env它aready是。 – jiamo

1

您需要導出Python的變量。

$ export test=4 

然後執行您的Python腳本:

$ ./test.py 
+0

'export test = 4; python test.py'作品 – jiamo

+0

我不確定你爲什麼用'test = 2獲得'2';測試= 4; echo $ test',因爲它肯定應該是'4'。 –

+0

我改變了這個問題。錯過寫。 – jiamo

1

這...

test=4 python test.py 

...是單python命令,具有可變test在其環境中顯式地設置,而此...

test=4; python test.py 

...是兩個單獨的命令。第一個告訴bash在當前shell中設置變量test(不標記出口),第二個是python命令。自然,Python不會在其環境中看到變量。但是,如果你這樣做之後

echo $test 

那麼(不是echo command)擴展變量引用它的價值,因爲它處理命令行。由此產生的擴展命令是

echo 4 

,它會做你所期望的。