【问题标题】:Using os.system and subprocess.Popen使用 os.system 和 subprocess.Popen
【发布时间】:2013-03-09 04:00:38
【问题描述】:

我一直在尝试编写一个 python 脚本来远程控制我的虚拟机。例如,我想在我的虚拟机上运行一个程序并检查它是否正在运行。对于这一步,我尝试使用 Os.system,它似乎正在工作,但为了更好地控制我喜欢使用子进程,但不幸的是没有成功。我为 os.system 和 subprocess 提供了我的代码,如下所示:

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))

对于第二段代码,我收到一个错误:

错误:无法打开虚拟机:F:\ClientUbuntu10464bit.vmx,虚拟机无法打开 找到了

【问题讨论】:

  • 错误消息在U 之前缺少\。一般来说,虽然我不知道他们为什么表现不同,但我对双引号字符串中的那些单反斜杠有点怀疑。我会担心那些被破坏的。
  • 好评!我发现 shlex.split 输出没有考虑路径中的那些 \s 所以如果我打印出 args,它将是: ['vmrun', '-gu', 'root', '-gp', ' mohsen77', 'runProgramInGuest', 'F:ClientUbuntu10464bit.vmx', '/bin/ls', '-l'] 这不是我们想要的。当我使用 split 时,我必须找到一个解决方案来保留那些 \s。
  • 问题通过将行更改为:args = shlex.split("vmrun -gu root -gp mohsen77 runProgramInGuest F:/Client/Ubuntu10464bit.vmx /bin/ls -l")

标签: python shell virtual-machine vmware-workstation


【解决方案1】:

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

(从 cmets 的讨论中得到答案。)

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 2015-05-20
    • 2018-04-30
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多