2013-03-20 77 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

在双引号字符串中的反斜线可能特殊的含义,这可能会导致它们消失。我不确定为什么这两个调用的工作方式不同,但尝试将反斜杠加倍或更改为正斜杠。

(解除对评论中讨论的回答。)

相关问题