【发布时间】:2011-05-28 03:48:28
【问题描述】:
我想创建一个进程的子进程。
什么是一个工作示例来说明如何实现这一点?
【问题讨论】:
标签: python subprocess
我想创建一个进程的子进程。
什么是一个工作示例来说明如何实现这一点?
【问题讨论】:
标签: python subprocess
从subprocess 文档开始。
如果你想得到输出:
>>> import subprocess
>>> output = subprocess.Popen(['uname', '-a'], stdout=subprocess.PIPE).communicate()[0]
>>> output
'Linux'
如果你只想调用而不处理输出:
>>> subprocess.call(['echo', 'Hi'])
Hi
0
subprocess.check_call 是一样的,只是它抛出一个CalledProcessError,以防使用无效参数调用命令。
【讨论】:
Popen 的参数。如果您有一个字符串,请执行 string.split() 然后将其传递给Popen。
communicate 方法的全部目的是等待进程完成并返回所有输出。如果您不想等待,请不要拨打communicate。相反,从 stdout 或 stderr 属性读取以读取输出。
启动和监控子流程:
import subprocess, time, os, signal
args=['/usr/bin/vmstat','-n','2']
app=subprocess.Popen(args=args, stdout=open('somefile','w'))
print "Your app's PID is %s. You can now process data..." % app.pid
time.sleep(5)
if app.poll() == None: print "Process is still running after 5s."
print "The app outputed %s bytes." % len(open('somefile','r').read())
print "Stopping the process..."
os.kill(app.pid, signal.SIGTERM)
还有更多。只需查看 Popen 文档即可。
【讨论】:
import subprocess
subprocess.call(['echo', 'hello world'])
【讨论】:
如果你想运行一个简单的命令而不是提供一个单独的文件,这对我有用
import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode
要获取进程的返回码,您可以使用process.returncode
要获得回复,您可以使用process.communicate()
如果您感到困惑,您可以使用 command="ls" 测试此代码
如果您收到 returncode 而不是 0,那么您可以在此处查看该错误代码的含义:http://tldp.org/LDP/abs/html/exitcodes.html
有关子流程的更多详细信息:http://docs.python.org/library/subprocess.html
【讨论】:
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
subprocess.call(os.popen(tempFileName), shell=True)
os.remove(tempFileName)
【讨论】:
根据user225312的回答,我准备了以下一行,它可以帮助您测试子流程:
python -c "import subprocess;
output = subprocess.Popen(['uname', '-a'], stdout=subprocess.PIPE).communicate()[0];
print output"
结果如下:
Linux xxx.xxx.xxx.xxx 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
【讨论】: