Python在kvm qemu/remote viewer中自动化用户任务

Python在kvm qemu/remote viewer中自动化用户任务,python,kvm,Python,Kvm,我正在编写一个简单的脚本,以自动执行启动虚拟机、查找其spice tcp端口和启动远程查看器与虚拟机交互的重复任务。按顺序排列的命令是: virsh -c qemu:///system start test_machine virsh -c qemu:///system domdisplay test_machine 这将输出如下内容:spice://127.0.0.1:5903. 第三个命令是: remote-viewer spice://127.0.0.1:5903 在RHEL 7上的p

我正在编写一个简单的脚本,以自动执行启动虚拟机、查找其spice tcp端口和启动远程查看器与虚拟机交互的重复任务。按顺序排列的命令是:

virsh -c qemu:///system start test_machine
virsh -c qemu:///system domdisplay test_machine
这将输出如下内容:spice://127.0.0.1:5903. 第三个命令是:

remote-viewer spice://127.0.0.1:5903
在RHEL 7上的python 2.7.5中,我有以下脚本:

#!/usr/bin/python

import subprocess
import pipes

machine_name = 'test_machine'

return_code = subprocess.check_output(['virsh', '-c', 'qemu:///system', 'start', machine_name])
return_code = subprocess.check_output(['virsh', '-c', 'qemu:///system', 'domdisplay', machine_name])
print str(return_code)
esc_return_code = pipes.quote(return_code)
print "remote-viewer {}".format(return_code)
#proc = subprocess.check_output(["remote-viewer {}".format(esc_return_code)]) #, return_code]) 
我的前两个命令按预期工作——这是远程查看器的第三个命令抛出错误

我尝试过一些不同的方法,认为是特殊角色造成了问题,但现在我看到前两个命令工作正常,我不相信。我还尝试了与前两个命令相同的格式,如下所示:

subprocess.check_output(['remote-viewer', return_code])
按原样运行脚本将提供以下输出:

spice://127.0.0.1:5903

remote-viewer spice://127.0.0.1:5903

Traceback (most recent call last):
  File "/mnt/data/Scripts/runvm.py", line 13, in <module>
    proc = subprocess.check_output(["remote-viewer {}".format(esc_return_code)]) #, return_code]) 
  File "/usr/lib64/python2.7/subprocess.py", line 568, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

我缺少什么?

您可以使用Popen和shell=True来运行该命令

From subprocess import Popen
output='spice://127.0.0.1:5903'
Command='remote-viewer'+' '+output
#Proc=Popen(Command,shell=True)
Proc=Popen(Command)

这绝对有效。有没有更安全的方法?据我所知,壳牌可能会以这种方式被滥用。我希望至少在pipes.quote()中使用转义版本的命令,但这似乎不起作用——返回到“没有这样的文件或目录”。如果你不想使用shell=True,请查看下面的链接,其中在windows和Ubuntu上启动的命令没有shell=True
From subprocess import Popen
output='spice://127.0.0.1:5903'
Command='remote-viewer'+' '+output
#Proc=Popen(Command,shell=True)
Proc=Popen(Command)