2013-07-23 127 views
1

我想使用python設置環境變量。而這個變量用在另一個腳本中。 我的代碼是:在一個腳本中設置環境變量並在另一個腳本中使用此變量

#!/usr/bin/env python 
import os 
os.environ['VAR'] = '/current_working_directory' 

上述Python腳本執行後,我執行使用相同的變量「VAR」第二腳本,但它不工作。 但是,當我做export VAR='/current_working_directory並運行第二個腳本時,它工作正常。我也試過putenv()

回答

2

這取決於如何調用第二個python腳本。

如果你有一個shell,並且shell首先運行第一個python腳本,那麼第二個,它將不起作用。原因是第一個python腳本從shell繼承了環境。但修改os.environ[]或調用putenv()將僅修改繼承環境 - 第二個python腳本中的一個,而不是,它是shell腳本中的一個。

如果現在shell腳本運行第二個python腳本,它將再次從shell中繼承環境...並且由於shell腳本未修改,因此您無法看到第一個python腳本所做的修改。

一個才達到你的目標的方法是使用一個輔助文件:

#!/bin/bash 
rm -f envfile 
./first_pythonscript 
test -f envfile && . envfile 
rm -f envfile 
./second_pythonscript 

這碼原油,它不會工作,如果shell腳本運行的兩個實例,所以不要使用它原樣是。但我希望你明白這一點。

另一種方法是讓second_pythonscript不是一個程序,而是一個first_pythonscript可以導入的Python模塊。您還可以在導入時將其製作爲混合型庫,通過if __name__ == "__main__":構造運行時編程。

最後,您可以使用os函數之一,例如, os.spawnvpe

0

此代碼應提供所需的環境,你的第二個腳本:

#!/usr/bin/env python 
import os 
os.environ['VAR'] = '/current_working_directory' 

execfile("/path/to/your/second/script.py") 
+0

這是功能上等同於'SH -c「VAR =/current_working_directory EXEC /路徑/到/你/秒/ script.py'(前提是你在Unix,和第二個腳本是正確使用chmod + X並有一個正確的shebang線)。 – tripleee

+0

是的,它做同樣的事情,但他的聲明是:「我試圖使用python設置環境變量」;) – Frodon

0

子進程不能改變它的父進程的環境。

一般的shell編程解決方案是讓你的第一個腳本打印出你需要的值,並在調用過程中賦值。然後,你可以做

#!/bin/sh 
# Assign VAR to the output from first.py 
VAR="$(first.py)" 
export VAR 
exec second.py 

或更簡潔

#!/bin/sh 
VAR="$(first.py)" second.py 

顯然,如果從first.py輸出是微不足道的獲得而無需調用的Python,這往往是一個更好的辦法;但是對於例如有兩個腳本從庫中調用不同的函數和/或與公共後端進行通信,這是一種常見模式。

儘管如此,使用Python進行兩段Python代碼之間的通信往往更加優雅和Pythonic。

#!/usr/bin/env python 
from yourlib import first, second 
value=first() 
# maybe putenv VAR here if that's really, really necessary 
second(value) 
相關問題