我正在开发一个包装脚本,它将运行vmware可执行文件,允许虚拟机启动/关闭/注册/注销操作的自动化.我正在尝试使用子进程来处理调用可执行文件,但子进程无法正确处理可执行文件路径和可执行文件参数中的空格.下面是一段代码片段:
vmrun_cmd = r"c:/Program Files/VMware/VMware Server/vmware-cmd.bat"
def vm_start(target_vm):
list_arg = "start"
list_arg2 = "hard"
if vm_list(target_vm):
p = Popen([vmrun_cmd, target_vm, list_arg, list_arg2], stdout=PIPE).communicate()[0]
print p
else:
vm_register(target_vm)
vm_start(target_vm)
def vm_list2(target_vm):
list_arg = "-l"
p = Popen([vmrun_cmd, list_arg], stdout=PIPE).communicate()[0]
for line in p.split('\n'):
print line
Run Code Online (Sandbox Code Playgroud)
如果我调用vm_list2函数,我会得到以下输出:
$ ./vmware_control.py --list
C:\Virtual Machines\QAW2K3Server\Windows Server 2003 Standard Edition.vmx
C:\Virtual Machines\ubunturouter\Ubuntu.vmx
C:\Virtual Machines\vacc\vacc.vmx
C:\Virtual Machines\EdgeAS-4.4.x\Other Linux 2.4.x kernel.vmx
C:\Virtual Machines\UbuntuServer1\Ubuntu.vmx
C:\Virtual Machines\Other Linux 2.4.x kernel\Other Linux 2.4.x kernel.vmx
C:\Virtual Machines\QAClient\Windows XP Professional.vmx
Run Code Online (Sandbox Code Playgroud)
如果我调用vm_start函数,它需要一个path-to-vm参数,我得到以下输出:
$ ./vmware_control.py …Run Code Online (Sandbox Code Playgroud) 我试图从一个产生长而耗时的输出的过程中读取.不过,我想抓住它的输出为当它被生产.但是使用类似下面的东西似乎是在缓冲命令的输出,所以我最终得到了所有输出行:
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0)
for line in p.stdout:
print line
Run Code Online (Sandbox Code Playgroud)
我在MacOS 10.5上尝试这个
有没有办法从python调用程序而不等待它返回?我创建了一个脚本,将程序复制到目录并运行该程序.但是当我从python调用程序时,python脚本不会退出,直到我启动的程序退出.我试过os.system和Popen.还有另一种方法吗?
添加信息:os.spawnl与os.P_DETACH仍然不起作用; 根据文档,"P_DETACH类似于P_NOWAIT,但新进程与调用进程的控制台分离".但它仍然以某种方式附加到我的调用进程(调用脚本将不会退出,直到任何被调用的可执行文件返回)
程序:
os.system("start test.exe")
print "Done"
Run Code Online (Sandbox Code Playgroud)
执行test.exe后,它会打印Done.但它不会终止脚本的执行(脚本进程仍在运行).尝试用P_DETACH创建一个守护程序线程和Popen,仍然没有去.
我正在尝试编写一个使用该subprocess模块的小应用程序.
我的程序调用外部Bash命令,需要一些时间来处理.在此期间,我想向用户展示一系列这样的消息:
处理.请稍等...
输出为foo()
我怎么能用Popen.wait()或者这样做呢Popen.poll().我已经读过我需要使用的Popen.returncode,但我怎么能得到它来主动检查状态,我不知道.
我正在编写一个python脚本,它使用subprocess.Popen来执行两个程序(来自编译的C代码),每个程序生成stdout.该脚本获取该输出并将其保存到文件中.因为输出有时足以压倒subprocess.PIPE,导致脚本挂起,所以我将stdout直接发送到日志文件.我想让我的脚本写一些文件的开头和结尾,以及两个subprocess.Popen调用之间.但是,当我查看我的日志文件时,我从脚本写入日志文件的所有内容都在文件顶部,然后是所有可执行文件stdout.如何将添加的文本交错到文件?
def run(cmd, logfile):
p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=logfile)
return p
def runTest(path, flags, name):
log = open(name, "w")
print >> log, "Calling executable A"
a_ret = run(path + "executable_a_name" + flags, log)
print >> log, "Calling executable B"
b_ret = run(path + "executable_b_name" + flags, log)
print >> log, "More stuff"
log.close()
Run Code Online (Sandbox Code Playgroud)
日志文件具有:调用可执行文件A调用可执行文件B更多内容[...来自两个可执行文件的标准输出...]
例如,有没有办法在调用Popen后将A的stdout刷新到日志中?还有一件事可能是相关的:可执行A开始然后在B上,并且在B打印完成后,A然后打印更多东西并完成.
我在RHE Linux上使用Python 2.4.
我想开始一个需要几分钟才能完成的程序.在此期间,我想阅读程序的进度消息(打印在标准输出上).问题是我找不到在运行期间读出输出的方法.
我发现读取程序输出的唯一函数是Popen.communicate(),但是这个方法一直等到进程完成.因此,无法获得进度并以特殊格式化方式使用户可见.
是否有可能以另一种方式做到这一点?
当我subprocess.popen使用我的脚本运行该过程时,我在屏幕上看到程序的输出.有可能隐藏它吗?(Ubuntu 10.10,普通终端)
我有以下代码将md5sums写入日志文件
for file in files_output:
p=subprocess.Popen(['md5sum',file],stdout=logfile)
p.wait()
Run Code Online (Sandbox Code Playgroud)
这些是并行写的吗?即如果md5sum对其中一个文件花费很长时间,那么在等待前一个文件完成之前是否会启动另一个文件?
如果上面的答案是肯定的,我可以假设写入日志文件的md5sums的顺序可能因md5sum对每个文件的使用时间而有所不同吗?(有些文件可能很大,有些文件很小)
这是一个跟进这个问题,但如果我想传递一个参数stdin来subprocess,我怎么能得到实时输出?这就是我现在拥有的; 我也尝试从模块替换Popen,这只会导致脚本挂起.callsubprocess
from subprocess import Popen, PIPE, STDOUT
cmd = 'rsync --rsh=ssh -rv --files-from=- thisdir/ servername:folder/'
p = Popen(cmd.split(), stdout=PIPE, stdin=PIPE, stderr=STDOUT)
subfolders = '\n'.join(['subfolder1','subfolder2'])
output = p.communicate(input=subfolders)[0]
print output
Run Code Online (Sandbox Code Playgroud)
在前一个我没有通过的问题stdin我被建议使用p.stdout.readline,那里没有任何空间来管道stdin.
附录:这适用于转移,但我只看到输出的结尾,我希望看到转移的细节发生时.
我想连续执行多个命令:
即(只是为了说明我的需要):
cmd(外壳)
然后
cd dir
和
LS
并阅读ls的结果.
有什么想法与子进程模块?
更新:
cd dir和ls只是一个例子.我需要运行复杂的命令(遵循特定的顺序,没有任何流水线操作).实际上,我想要一个子进程shell并能够在其上启动许多命令.
我有
cmd = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
for line in cmd.stdout:
columns = line.split(' ')
print (columns[3])
Run Code Online (Sandbox Code Playgroud)
在第3行中有错误类型Str不支持缓冲区API.
我在使用Python 3.3时做错了什么
python ×10
subprocess ×10
command ×1
linux ×1
popen ×1
python-2.4 ×1
python-3.3 ×1
stdout ×1
windows ×1