标签: subprocess

当多个参数包含空格时如何使用子进程?

我正在开发一个包装脚本,它将运行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)

python subprocess

21
推荐指数
4
解决办法
3万
查看次数

使用Python中的子进程从进程中无缓冲读取

我试图从一个产生长而耗时的输出的过程中读取.不过,我想抓住它的输出为当它被生产.但是使用类似下面的东西似乎是在缓冲命令的输出,所以我最终得到了所有输出行:

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 subprocess

21
推荐指数
2
解决办法
7713
查看次数

如何从python调用程序而不等待它返回

有没有办法从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,仍然没有去.

python command subprocess popen

21
推荐指数
3
解决办法
5万
查看次数

使用子进程wait()和poll()

我正在尝试编写一个使用该subprocess模块的小应用程序.

我的程序调用外部Bash命令,需要一些时间来处理.在此期间,我想向用户展示一系列这样的消息:

处理.请稍等...
输出为foo()

我怎么能用Popen.wait()或者这样做呢Popen.poll().我已经读过我需要使用的Popen.returncode,但我怎么能得到它来主动检查状态,我不知道.

python subprocess

21
推荐指数
2
解决办法
5万
查看次数

将stdout从subprocess.Popen保存到文件,再将更多内容写入文件

我正在编写一个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.

python linux subprocess stdout python-2.4

21
推荐指数
1
解决办法
7万
查看次数

从子进程获取进度消息

我想开始一个需要几分钟才能完成的程序.在此期间,我想阅读程序的进度消息(打印在标准输出上).问题是我找不到在运行期间读出输出的方法.

我发现读取程序输出的唯一函数是Popen.communicate(),但是这个方法一直等到进程完成.因此,无法获得进度并以特殊格式化方式使用户可见.

是否有可能以另一种方式做到这一点?

当我subprocess.popen使用我的脚本运行该过程时,我在屏幕上看到程序的输出.有可能隐藏它吗?(Ubuntu 10.10,普通终端)

python subprocess

21
推荐指数
1
解决办法
9355
查看次数

Python:并行运行子进程

我有以下代码将md5sums写入日志文件

for file in files_output:
    p=subprocess.Popen(['md5sum',file],stdout=logfile)
p.wait()
Run Code Online (Sandbox Code Playgroud)
  1. 这些是并行写的吗?即如果md5sum对其中一个文件花费很长时间,那么在等待前一个文件完成之前是否会启动另一个文件?

  2. 如果上面的答案是肯定的,我可以假设写入日志文件的md5sums的顺序可能因md5sum对每个文件的使用时间而有所不同吗?(有些文件可能很大,有些文件很小)

python subprocess

21
推荐指数
3
解决办法
6万
查看次数

从需要stdin的子进程实时打印stdout

这是一个跟进这个问题,但如果我想传递一个参数stdinsubprocess,我怎么能得到实时输出?这就是我现在拥有的; 我也尝试从模块替换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.

附录:这适用于转移,但我只看到输出的结尾,我希望看到转移的细节发生时.

python subprocess

21
推荐指数
1
解决办法
3万
查看次数

在Python中按顺序执行命令

我想连续执行多个命令:

即(只是为了说明我的需要):

cmd(外壳)

然后

cd dir

LS

并阅读ls的结果.

有什么想法与子进程模块?

更新:

cd dir和ls只是一个例子.我需要运行复杂的命令(遵循特定的顺序,没有任何流水线操作).实际上,我想要一个子进程shell并能够在其上启动许多命令.

python windows subprocess

20
推荐指数
3
解决办法
4万
查看次数

subprocess和Type Str不支持缓冲区API

我有

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 subprocess python-3.3

20
推荐指数
1
解决办法
1万
查看次数

标签 统计

python ×10

subprocess ×10

command ×1

linux ×1

popen ×1

python-2.4 ×1

python-3.3 ×1

stdout ×1

windows ×1