我想以下面的方式使用subprocess模块: 创build一个可能需要很长时间执行的新进程。 捕获stdout (或stderr ,或潜在的两个,一起或分开) 处理来自subprocess的数据,也许是在接收到的每一行上触发事件(在wxPython中说)或者直接打印出来。 我用Popen创build了进程,但是如果使用通讯(),那么一旦进程终止,数据就会一次全部到达我。 如果我创build一个单独的线程,执行阻塞readline() myprocess.stdout (使用stdout = subprocess.PIPE myprocess.stdout ),我也没有得到这个方法的任何行,直到进程终止。 (不pipe我设定为bufsize) 有没有办法处理这个不可怕的,并在多个平台上运行良好?
我有一个.sh脚本,我打电话给source the_script.sh 。 定期打电话很好。 不过,我想通过subprocess.Popen从我的python脚本调用它。 从Popen调用它,我得到以下两个scheme调用中的以下错误: foo = subprocess.Popen("source the_script.sh") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/subprocess.py", line 672, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1213, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory >>> foo = subprocess.Popen("source the_script.sh", shell = True) >>> /bin/sh: […]
我想使用Popen从Python脚本中调用ImageMagick中的“convert”实用工具,如下所示: Popen(["convert", input_path, "-flop", output_file_path]) (上面的例子简单地反转了图像水平) 问题是,当我在Windows中运行脚本时,它错误地调用Windows附带的convert.exe实用程序将FAT分区转换为NTFS! (位于\ Windows \ system32) 现在,如果我在system32以外的任何目录中随机打开一个命令提示符,然后键入“convert”,它将正确运行ImageMagick可执行文件。 所以,这意味着Popen自动查找system32。 我怎样才能让它不看在system32,并运行正确的可执行文件?
我正在使用Windows 8 / XP上的Python 2.7。 我有一个程序A运行另一个程序B使用下面的代码: p = Popen(["B"], stdout=PIPE, stderr=PIPE) stdout, stderr = p.communicate() return B运行一个批处理脚本C. C是一个长时间运行的脚本,我想B退出,即使C还没有完成。 我用下面的代码(在B中)完成了它: p = Popen(["C"]) return 当我运行B时,它按预期工作。 当我运行A时,我预计B退出时会退出。 但是A等到C出口,即使B已经离开了。 有什么想法和可能的解决scheme可能是什么? 不幸的是,将A改为B的明显解决scheme不是一种select。 下面是一个函数示例代码来说明这个问题: https : //www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl=1 任何input是非常感激。
由于os.popen正在被subprocess.popen取代,我想知道我将如何转换 os.popen('swfdump /tmp/filename.swf/ -d') 到subprocess.popen() 我试过了: subprocess.Popen("swfdump /tmp/filename.swf -d") subprocess.Popen("swfdump %s -d" % (filename)) # NOTE: filename is a variable # containing /tmp/filename.swf 但是我想我没有把这个写出来。 任何帮助,将不胜感激。 谢谢
我相信在稍微修改一下的环境下运行一个外部命令是一个很常见的情况。 这就是我倾向于这样做的方式: import subprocess, os my_env = os.environ my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"] subprocess.Popen(my_command, env=my_env) 我有一种直觉,认为有更好的办法。 它看起来好吗?
是否有可能修改下面的代码,从“标准输出”和“标准错误”打印输出: 打印在terminal上 (实时), 最后存储在输出和errsvariables? 代码: #!/usr/bin/python3 # -*- coding: utf-8 -*- import subprocess def run_cmd(command, cwd=None): p = subprocess.Popen(command, cwd=cwd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) outs, errs = p.communicate() rc = p.returncode outs = outs.decode('utf-8') errs = errs.decode('utf-8') return (rc, (outs, errs)) 感谢@unutbu,特别感谢@ jf-sebastian,最终的function: #!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from queue import Queue from […]