python

时间:2015-07-08 21:51:52

标签: python qemu

我正在尝试编写一个启动进程并执行某些操作的python脚本。 我希望通过脚本自动执行的命令在图片中以红色圈出。 问题是在执行第一个命令后,将运行qemu环境,并且应该在qemu环境中执行其他命令。所以我想知道如何通过python中的脚本执行这些命令?因为我知道我可以做第一个命令,但我不知道如何在进入qemu环境时执行这些命令。

enter image description here

你能帮我解决一下这个过程吗?

2 个答案:

答案 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 包含所有下一个命令。