2012-11-02 29 views
1

我正在windows機器上運行python腳本以調用遠程linux機器上的另一個python腳本。我使用subprocess.call與ssh來做到這一點,如下所示: subprocess.call('ssh -i <identify file> [email protected] python <script_on_linux_machine>'),這工作正常。設置環境變量subprocess.call在遠程Linux機器上運行python腳本時出錯

但是,如果我想設置一些環境變量,如下所示: subprocess.call('ssh -i <identify file> [email protected] python <script_on_linux_machine>', env={key1:value1})它失敗。 我得到以下錯誤: ssh_connect: getnameinfo failed ssh: connect to host <hostname> port 22: Operation not permitted 255

我試着將ssh命令分成列表和傳遞。沒有幫助。 我試圖通過subprocess.call()運行其他「本地」(Windows)命令並嘗試設置env。它工作正常。 我試圖在遠程linux機器上運行其他命令(如ls)。再次,subprocess.call()工作正常,只要我不嘗試設置環境。

我在做什麼錯?我能在遠程機器上設置python腳本的環境嗎?任何幫助將不勝感激。

回答

2

要設置遠程端的環境,您需要在遠程端執行呼叫。嘗試編寫和上傳執行此環境設置的包裝腳本,例如

import subprocess 
import sys 


args = sys.argv[1:] 
env = dict(zip(args[::2], args[1::2])) 

subprocess.call(['python', 'script.py'], env=env) 

現在,您只需在原始調用中傳遞此信息,例如,

subprocess.call('ssh -i <identify file> [email protected] ' 
       'python <script_on_linux_machine> %s %s' % (key, value)) 

或者將字典轉換爲所需格式的一些更具擴展性的方法。

+0

感謝您的回覆。但是,我想要設置的env變量只有在運行時才知道 - 當我在windows機器上運行腳本時。所以,我需要在運行時將這些環境變量傳遞給運行在遠程機器上的腳本。 –

+0

這有幫助嗎? – pydsigner

+0

謝謝。是的,這讓事情變得清晰。因此,如果我理解正確,我現在應該創建兩個'subprocess.calls' - 一個用於setEnv.py,另一個用於我想要執行的實際腳本。第一次通話中設定的'env'是否會反映第二次通話?我可以嘗試驗證它,但我需要等到星期一。因此,這個問題。 –

相關問題