我正在尝试编写一个启动进程并执行某些操作的python脚本。 我希望通过脚本自动执行的命令在图片中以红色圈出。 问题是在执行第一个命令后,将运行qemu环境,并且应该在qemu环境中执行其他命令。所以我想知道如何通过python中的脚本执行这些命令?因为我知道我可以做第一个命令,但我不知道如何在进入qemu环境时执行这些命令。
你能帮我解决一下这个过程吗?
答案 0 :(得分:1)
不要忘记Python包含电池。看一下标准库中的Suprocess module。管理流程存在很多陷阱,模块会处理所有这些问题。
您可能想要启动qemu进程并发送写入其标准输入(stdin)的下一个命令。子进程模块将允许您执行此操作。看到qemu已command line options连接到stdi:-chardev stdio ,id=id
答案 1 :(得分:1)
首先想到的是pexpect,谷歌上的快速搜索结果显示了这篇博文 automatically-testing-vms-using-pexpect-and-qemu,这似乎与您正在做的事情非常相似:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
// return height
}
您也可以使用import pexpect
image = "fedora-20.img"
user = "root"
password = "changeme"
# Define the qemu cmd to run
# The important bit is to redirect the serial to stdio
cmd = "qemu-kvm"
cmd += " -m 1024 -serial stdio -net user -net nic"
cmd += " -snapshot -hda %s" % image
cmd += " -watchdog-action poweroff"
# Spawn the qemu process and log to stdout
child = pexpect.spawn(cmd)
child.logfile = sys.stdout
# Now wait for the login
child.expect('(?i)login:')
# And login with the credentials from above
child.sendline(user)
child.expect('(?i)password:')
child.sendline(password)
child.expect('# ')
# Now shutdown the machine and end the process
if child.isalive():
child.sendline('init 0')
child.close()
if child.isalive():
print('Child did not exit gracefully.')
else:
print('Child exited gracefully.')
执行此操作,检查stdout以查找subprocess.Popen
行并写入stdin。大致像这样:
(qemu)
from subprocess import Popen,PIPE
# pass initial command as list of individual args
p = Popen(["./tracecap/temu","-monitor",.....],stdout=PIPE, stdin=PIPE)
# store all the next arguments to pass
args = iter([arg1,arg2,arg3])
# iterate over stdout so we can check where we are
for line in iter(p.stdout.readline,""):
# if (qemu) is at the prompt, enter a command
if line.startswith("(qemu)"):
arg = next(args,"")
# if we have used all args break
if not arg:
break
# else we write the arg with a newline
p.stdin.write(arg+"\n")
print(line)# just use to see the output
包含所有下一个命令。