2013-03-20 81 views
0

我一直在嘗試編寫一個python腳本來遠程控制我的虛擬機。例如,我想在我的虛擬機上運行一個程序並檢查它是否正在運行。對於這一步,我嘗試使用Os.system,它似乎在工作,但爲了更好地控制,我喜歡使用子進程,但不幸的是沒有成功。我提供我的代碼兩者使用os.system和子流程如下:使用os.system和subprocess.Popen

os.system("vmrun -gu root -gp mohsen77 runProgramInGuest F:\Client\Ubuntu10464bit.vmx usr/bin/tcpreplay --intf1=eth4 /home/srastega/output.pcap") 
print('PID is:' + str(os.getpid())) 

args = shlex.split("vmrun -gu root -gp mohsen77 runProgramInGuest F:\Client\Ubuntu10464bit.vmx /bin/ls -l") 
tcpreplay = subprocess.Popen(args, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=True) 
out, err = tcpreplay.communicate() 
print(out) 
print('PID is:' + str(tcpreplay.pid)) 

對於第二部分的代碼,我收到了一個錯誤:

Error: Cannot open VM: F:\ClientUbuntu10464bit.vmx, The virtual machine cannot b e found

+0

錯誤消息在「U」之前缺少\。一般來說,雖然我不知道他們爲什麼表現不同,但我對雙引號字符串中的單反斜線有點懷疑。我會擔心那些被弄傷的人。 – rra 2013-03-20 07:10:03

+0

好評!我發現shlex.split輸出沒有考慮路徑中的那些,所以如果我打印出參數,它將是:['vmrun','-gu','root','-gp',' mohsen77','runProgramInGuest','F:ClientUbuntu10464bit.vmx','/ bin/ls','-l']這不是我們想要的。當我使用split時,我必須找到一個解決方案來保留這些。 – samaneh 2013-03-20 07:35:58

+0

通過將行更改爲:args = shlex.split(「vmrun -gu root -gp mohsen77 runProgramInGuest F:/Client/Ubuntu10464bit.vmx/bin/ls -l」)解決了問題。 – samaneh 2013-03-20 07:50:43

回答

0

在雙引號字符串中的反斜線可能特殊的含義,這可能會導致它們消失。我不確定爲什麼這兩個調用的工作方式不同,但嘗試將反斜槓加倍或更改爲正斜槓。

(解除對評論中討論的回答。)

相關問題