如何在Python中创建子进程?

6
我想创建一个进程的子进程。
请提供一个可行的示例,展示如何完成这个任务。
6个回答

6

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

一个好的 subprocess 教程


是的,这就是我想要的。还有一个问题,当我使用“output = subprocess.Popen(['uname', '-a'], stdout=subprocess.PIPE).communicate()[0]”这个命令时,它可以正常运行...但如果我要运行像“rdiff-backup -v --force <> <> <> <>”这样的命令,如果我将它们使用空格分开并将该列表应用于此命令,会出现错误...所以我的问题是我必须通过使用空格拆分来编写我的命令吗? - sasa
你应该将列表作为Popen的参数,最好是作为参数。如果你有一个字符串,请使用string.split()将其拆分,然后将其传递给Popen - user225312
我们正在从终端读取,而不是标准输入/输出。请注意:stdout=subprocess.PIPE - user225312
哦,好的。那么你能告诉我如何使用子进程读取连续输出吗? - sasa
https://dev59.com/B3NA5IYBdhLWcg3wrPyq - user225312
显示剩余5条评论

3

启动和监控子进程:

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文档即可了解更多信息。


1

如果您想运行简单的命令而不是提供单独的文件,以下是我使用的方法:

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


1
import subprocess

subprocess.call(['echo', 'hello world'])

subprocess.call是做什么的?我正在运行一个名为test.py的文件,我想创建子进程运行它。这是否意味着我必须像这样运行它subprocess.call(['python', 'test.py'])? - sasa
Popen和call都会创建一个新进程,但是call会等待进程完成后才返回。 - dan_waterworth
@sasa:如果你的新“进程”是用Python编写的,你可以考虑使用execfile、线程或多进程,具体取决于你想要做什么。subprocess用于告诉计算机运行一个完全独立的程序。 - Thomas K
是的,这就是我想要的。还有一个问题,当我使用“output = subprocess.Popen(['uname', '-a'], stdout=subprocess.PIPE).communicate()[0]”这个命令时,它可以完美地运行...但如果我要运行像“rdiff-backup -v --force <> <> <> <>”这样的命令,如果我使用空格将它们分开并将该列表应用于此命令,则会出现错误...所以我的问题是,我必须使用空格将我的命令写成列表吗? - sasa
你可以使用 shlex.split 将字符串转换为列表。 - dan_waterworth
显示剩余4条评论

0

根据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


0
if os.name == 'nt':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
subprocess.call(os.popen(tempFileName), shell=True)
os.remove(tempFileName)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接