python subprocess.popen env怎么关闭程序

python中的subprocess Popen()使用_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
python中的subprocess Popen()使用
|0|0|文档简介
总评分3.7|
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢Python使用subprocess.Popen导致子进程hang住_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Python使用subprocess.Popen导致子进程hang住
来源:Linux社区&
作者:flyingsk
subprocess用于在python内部创建一个子进程,比如调用shell脚本等。
p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True)p.wait()// hang hereprint "subprocess finished"
在python的官方文档中对这个进行了解释:http://docs.python.org/2/library/subprocess.html
原因是stdout产生的内容太多,超过了系统的buffer
解决方法是使用communicate()方法。
p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = True)stdout, stderr = p.communicate()p.wait()print "subprocess finished"
相关资讯 & & &
& (05/23/:15)
& (12/07/:53)
& (09/01/:12)
& (03/08/:53)
& (12/05/:42)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款"属性 1.Popen.poll():用于检查子进程是否已经结束。设置并返回 returncode 属性。 2.Popen.wait():等待子进程结束。设置并返回 returncode 属性。 municate(input=None):与子进程进行交互。向 stdin 发送数据 ...."
黑客派 2428 号会员
python子进程模块subprocess详解
1.Popen.poll():用于检查子进程是否已经结束。设置并返回 returncode 属性。
2.Popen.wait():等待子进程结束。设置并返回 returncode 属性。
municate(input=None):与子进程进行交互。向 stdin 发送数据,或从 stdout 和 stderr 中读取数据。可选参数 input 指定发送到子进程的参数。Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:如果希望通过进程的 stdin 向其发送数据,在创建 Popen 对象的时候,参数 stdin 必须被设置为 PIPE。同样,如果希望从 stdout 和 stderr 获取数据,必须将 stdout 和 stderr 设置为 PIPE。
4.Popen.send_signal(signal):向子进程发送信号。
5.Popen.terminate():停止 (stop) 子进程。在 windows 平台下,该方法将调用 Windows API TerminateProcess()来结束子进程。
6.Popen.kill():杀死子进程。
7.Popen.stdin:如果在创建 Popen 对象是,参数 stdin 被设置为 PIPE,Popen.stdin 将返回一个文件对象用于策子进程发送指令。否则返回 None。
8.Popen.stdout:如果在创建 Popen 对象是,参数 stdout 被设置为 PIPE,Popen.stdout 将返回一个文件对象用于策子进程发送指令。否则返回 None。
9.Popen.stderr:如果在创建 Popen 对象是,参数 stdout 被设置为 PIPE,Popen.stdout 将返回一个文件对象用于策子进程发送指令。否则返回 None。
10.Popen.pid:获取子进程的进程 ID。
11.Popen.returncode:获取进程的返回值。如果进程还没有结束,返回 None。
12.subprocess.call(popenargs, **kwargs):运行命令。该函数将一直等待到子进程运行结束,并返回进程的 returncode。文章一开始的例子就演示了 call 函数。如果子进程不需要进行交互, 就可以使用该函数来创建。
13.subprocess.check_call(popenargs, kwargs):与 subprocess.call(*popenargs, kwargs) 功能一样,只是如果子进程返回的 returncode 不为 0 的话,将触发 CalledProcessError 异常。在异常对象中,包括进程的 returncode 信息。
&关于 subprocess 的安全性:
不像其他的 popen 函数,不会直接调用 /bin/sh 来解释命令,也就是说,命令中的每一个字符都会被安全地传递到子进程里。
一:用 subprocess 获取 stdout 和 stderr
第一种方案:
import subprocessp = subprocess.Popen(['tail','-10','/tmp/hosts.txt'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)stdout,stderr = p.communicate()print 'stdout :',stdoutprint 'stderr :',stder
popen 调用的时候会在父进程和子进程建立管道,然后我们可以把子进程的标准输出和错误输出都重定向到管道,然后从父进程取出。上面的 communicate 会一直阻塞,直到子进程跑完。这种方式是不能及时获取子程序的 stdout 和 stderr。
第二种方案:
可以获取实时的输出信息
p = subprocess.Popen("/etc/service/tops-cmos/module/hadoop/test.sh", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)returncode = p.poll()while returncode is None:line = p.stdout.readline()returncode = p.poll()line = line.strip()print lineprint returncode
这里就是把错误输出重定向到 PIPE 对应的标准输出,也就是说现在 stderr 都 stdout 是一起的了,下面是一个 while,poll 回去不断查看子进程是否已经被终止,如果程序没有终止,就一直返回 None,但是子进程终止了就返货状态码,甚至于调用多次 poll 都会返回状态码。上面的 demo 就是可以获取子进程的标准输出和标准错误输出。
二:使用 subprocess 的 Popen 函数执行系统命令
1、执行 shell 命令:
Popen 函数指定 shell=True 即可,linux 下参数 executable 将指定程序使用的 shell,windows 下无须指定。
在 windows 下执行 cd 命令获取当前目录
p2 = Popen('cd',shell=True)
2、执行其他程序
3、指定子进程工作路径:
使新建的子进程工作指定的工作目录之下:
import sys,os,subprocess,commandsfrom subprocess import Popen,PIPEp2 = Popen('cd',shell=True,stdout=PIPE,cwd='E:\svnworking')p2.wait()print "当前目录:%s" %p2.stdout.read()
上述命令使用了 cwd,该参数指定了子进程工作目录。这个参数很有用,有时涉及到相对路径的时候必须如果不指定 cwd,则程序可能出错。
a.py 文件:
p2 = Popen('python c:\b.py',shell=True,stdout=PIPE) #在 a.py 运行脚本 b.py
print "当前目录:%s" %p2.stdout.read()
b.py 文件:
f=open('test.txt','a') #注意这里使用了相对路径
当 a.py 和 b.py 不在同一个目录的时候,运行 a.py 肯定报错(找不到指定的文件 test.txt)。
原因:因为 p2 = Popen('python c:\b.py',shell=True,stdout=PIPE') 创建的子进程与 a.py 在同一目录下工作,而该目录没有 test.py。
解决方法:指定 cwd 参数。
4、获取 Popen 的返回值及输出
# -- coding: UTF-8 --#执行另外一个脚本import sys,os,subprocess,commandsfrom subprocess import Popen,PIPEp = Popen('python' + path + '\getCurPath.py', stdout=PIPE, stderr=PIPE)p.wait()if(p.returncode == 0):print "stdout:%s" %p.stdout.read()
三:subprocess 的 Popen 函数的等待(wait()方法)
1. Popen 对象创建后,主程序不会自动等待子进程完成。
我们必须调用对象的 wait()方法,父进程才会等待 ( 也就是阻塞 block):
& & import subprocess
& & child = subprocess.Popen(["ping","-c","5",""])
& & print("parent process")
从运行结果中看到,父进程在开启子进程之后并没有等待 child 的完成,而是直接运行 print。
2. 对比等待的情况:
& &import subprocess
& &child = subprocess.Popen(["ping","-c","5",""])
& &child.wait()
& &print("parent process")
此外,你还可以在父进程中对子进程进行其它操作,比如我们上面例子中的 child 对象:
child.poll() & & & & & # 检查子进程状态
child.kill() & & & & & # 终止子进程
child.send_signal() & &# 向子进程发送信号
child.terminate() & & &# 终止子进程
子进程的 PID 存储在 child.pid
四:subprocess 的 Popen 函数的标准输入、标准输出和标准错误
1. 可以在 Popen() 建立子进程的时候改变标准输入、标准输出和标准错误,
并可以利用 subprocess.PIPE 将多个子进程的输入和输出连接在一起,构成管道 (pipe):
& & import subprocess
& & child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
& & child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)
& & out = municate()
& & print(out)
subprocess.PIPE 实际上为文本流提供一个缓存区。
child1 的 stdout 将文本输出到缓存区,随后 child2 的 stdin 从该 PIPE 中将文本读取走。
child2 的输出文本也被存放在 PIPE 中,直到 communicate() 方法从 PIPE 中读取出 PIPE 中的文本。
要注意的是,communicate() 是 Popen 对象的一个方法,该方法会阻塞父进程,直到子进程完成。
2. 还可以利用 communicate() 方法来使用 PIPE 给子进程输入:
& & import subprocess
& & child = subprocess.Popen(["cat"], stdin=subprocess.PIPE)
& & municate("vamei")
我们启动子进程之后,cat 会等待输入,直到我们用 communicate() 输入 "vamei"。
通过使用 subprocess 包,我们可以运行外部程序。这极大的拓展了 Python 的功能。
如果你已经了解了操作系统的某些应用,你可以从 Python 中直接调用该应用 (而不是完全依赖 Python),
并将应用的结果输出给 Python,并让 Python 继续处理。
shell 的功能 (比如利用文本流连接各个应用),就可以在 Python 中实现。
「实验楼」程序员随身的代码自习室
Promoted by
Feel easy about trust.
Powered by
2.1.0 o 94ms1340人阅读
logcmd = &adb logcat -v time & C:/log.txt&
self.Popen = subprocess.Popen(logcmd&,stdout = subprocess.PIPE,shell=True)
用上面的方法来获取logcat的信息,它的实际原理是另外开启一个cmd命令来运行adb logcat的命令,即使后面用popen.terminate()也只能关闭cmd的命令,cmd命令被kill掉后,adb的线程由系统来托管,杀死不了adb的进程,从而导致adb logcat不能退出
解决思路:直接启动adb logcat,不能通过cmd命令来启动,就是不能启动cmd进程,然后cmd进程来启动adb进程,代码如下:
&filename = &C:/log.txt&
&logcat_file = open(filename, 'w')
logcmd = &adb logcat -v time&
self.Poplog = subprocess.P(logcmd,stdout=logcat_file,stderr=subprocess.PIPE)
最后使用完记得关闭:Poplog.terminate()
原文链接:
/Program/Python/606.shtml
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2436次
排名:千里之外
(2)(1)(2)(1)Python用subprocess的Popen来调用系统命令
时间: 13:13:46
&&&& 阅读:968
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
当我们须要调用系统的命令的时候,最先考虑的os模块。用os.system()和os.popen()来进行操作。可是这两个命令过于简单,不能完毕一些复杂的操作,如给执行的命令提供输入或者读取命令的输出,推断该命令的执行状态,管理多个命令的并行等等。这时subprocess中的Popen命令就能有效的完毕我们须要的操作。在这里对Popen予以简介。
以下是一个非常easy的样例,来自Python的官网教程:
&&& import shlex, subprocess
&&& command_line = raw_input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo ‘$MONEY‘"
&&& args = shlex.split(command_line)
&&& print args
[‘/bin/vikings‘, ‘-input‘, ‘eggs.txt‘, ‘-output‘, ‘spam spam.txt‘, ‘-cmd‘, "echo ‘$MONEY‘"]
&&& p = subprocess.Popen(args) # Success!
Popen它的构造函数例如以下:
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
參数args能够是字符串或者序列类型(如:list,元组),用于指定进程的可运行文件及其參数。假设是序列类型,第一个元素一般是可运行文件的路 径。我们也能够显式的使用executeable參数来指定可运行文件的路径。在windows操作系统上,Popen通过调用 CreateProcess()来创建子进程,CreateProcess接收一个字符串參数,假设args是序列类型,系统将会通过 list2cmdline()函数将序列类型转换为字符串。
參数bufsize:指定缓冲。我到如今还不清楚这个參数的详细含义,望各个大牛指点。
參数executable用于指定可执行程序。普通情况下我们通过args參数来设置所要执行的程序。假设将參数shell设为 True,executable将指定程序使用的shell。在windows平台下,默认的shell由COMSPEC环境变量来指定。
參数stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们能够是PIPE,文件描写叙述符或文件对象,也能够设置为None,表示从父进程继承。
參数preexec_fn仅仅在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程执行之前被调用。
參数Close_sfs:在windows平台下,假设close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管 道。我们不能将close_fds设置为True同一时候重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
假设參数shell设为true,程序将通过shell来运行。
參数cwd用于设置子进程的当前文件夹。
參数env是字典类型,用于指定子进程的环境变量。假设env = None,子进程的环境变量将从父进程中继承。
參数Universal_newlines:不同操作系统下,文本的换行符是不一样的。如:windows下用&/r/n&表示换,而Linux下用 &/n&。假设将此參数设置为True,Python统一把这些换行符当作&/n&来处理。
參数startupinfo与createionflags仅仅在windows下用效,它们将被传递给底层的CreateProcess()函数,用 于设置子进程的一些属性,如:主窗体的外观,进程的优先级等等。
subprocess.PIPE在创建Popen对象时,subprocess.PIPE能够初始化stdin, stdout或stderr參数。表示与子进程通信的标准流。
subprocess.STDOUT创建Popen对象时,用于初始化stderr參数,表示将错误通过标准输出流输出。
Popen的方法:
Popen.poll()&用于检查子进程是否已经结束。设置并返回returncode属性。
Popen.wait()&等待子进程结束。设置并返回returncode属性。
municate(input=None)与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选參数input指定发送到子进程的參数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:假设希望通过进程的stdin向其发送数据,在创建Popen对象的时候,參数stdin必须被设置为PIPE。相同,如 果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。
Popen.send_signal(signal)&向子进程发送信号。
Popen.terminate()停止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。
Popen.kill()杀死子进程。
Popen.stdin&假设在创建Popen对象是,參数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。否则返回None。
Popen.stdout&假设在创建Popen对象是,參数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。
Popen.stderr&假设在创建Popen对象是,參数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。
Popen.pid&获取子进程的进程ID。
Popen.returncode&获取进程的返回值。假设进程还没有结束,返回None。
以下是一个很easy的样例,来演示supprocess模块怎样与一个控件台应用程序进行交 互。
import subprocess&&&p = subprocess.Popen(&app2.exe&, stdin = subprocess.PIPE, /&&&stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False)&&&p.stdin.write(&3/n&)&&&p.stdin.write(&4/n&)&&&print p.stdout.read()&&&#&- 结果 &-&&&input x:&&&&input y:&&&&3 + 4 = 7&
app2.exe也是一个很easy的控制台程序,它从界面上接收两个数值,运行加操作,并将结 果打印到控制台上。代码例如以下:
#include &iostream&&&&&&&int main(int argc, const char *artv[])&&&{&&&int x,&&&cout && &input x: & &&&&&cin &&&&&cout && &input y: & &&&&&cin &&&&&cout && x && & + & && y && & = & && x + y &&&&&return 0;&&&}&
supprocess模块提供了一些函数,方便我们用于创建进程。
subprocess.call(*popenargs, **kwargs)执行命令。该函数将一直等待到子进程执行结束,并返回进程的returncode。文章一開始的样例就演示了call函数。假设子进程不须要进行交 互,就能够使用该函数来创建。
subprocess.check_call(*popenargs, **kwargs)&与subprocess.call(*popenargs, **kwargs)功能一样,仅仅是假设子进程返回的returncode不为0的话,将触发CalledProcessError异常。在异常对象中,包 括进程的returncode信息。
subprocess模块的内容就这么多。在Python手冊中,还介绍了怎样使用 subprocess来替换一些老的模块,老的函数的样例。赶兴趣的朋友能够看一下。
參考文档:
subprocess & Subprocess management
PyMoTW:subprocess
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/mengfanrong/p/4018760.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!}

我要回帖

更多关于 subprocess.popen 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信