如何关闭os.popen 关闭

python os模块中popen3返回处理 - 开源中国社区
当前访客身份:游客 [
当前位置:
用os模块的popen3调用unzip进行解压缩,popen3返回3个流(stdin、stdout、stderr)
cmd = u'unzip test.zip -d unziptest' fzip = os.popen3(cmd.encode('gbk'))
若忽略fzip这个元组或这直接关闭着三个流,则一切正常,若按下列方式处理则会挂起:
fzip[0].close() errstr = fzip[2].read() fzip[1].close() fzip[2].close() 调试时发现在第二句时陷入wait,而unzip并没有完成解压。若将第二句放在第三句后则正常。
求大神给个解释。。。。
---------------问题补充---------------
:测试时所用zip包名为中文,英文zip包无此现象
共有1个答案
<span class="a_vote_num" id="a_vote_num_
用subprocess模块吧
更多开发者职位上
有什么技术问题吗?
IUnKnow...的其它问题
类似的话题1298人阅读
脚本语言(34)
10:12&1938人阅读&(0)&&
python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回&#20540;是脚本的退出状态码,后者的返回&#20540;是脚本执行过程中的输出内容。实际使用时视需求情况而选择。
现假定有一个shell脚本test.sh:
#!/bin/bash
1.&echo &hello world!&
os.system(cmd):
该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回&#20540;的高位数则是1,如果低位数是0的情况下,则函数的返回&#20540;是0×100,换算为10进制得到256。
如果我们需要获得os.system的正确返回&#20540;,那使用位移运算可以还原返回&#20540;:
1.&&&& &n = os.system(test.sh)
2.&&&& n && 8
os.popen(cmd):
这种调用方式是通过管道的方式来实现,函数返回一个file-like的对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容)。使用os.popen调用test.sh的情况:
python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回&#20540;是脚本的退出状态码,后者的返回&#20540;是脚本执行过程中的输出内容。实际使用时视需求情况而选择。
明显地,像调用”ls”这样的shell命令,应该使用popen的方法来获得内容
以前就疑惑popen和system有什么不同,今天实际的应用,才让我恍然大悟
os.popen()可以实现一个“管道”,从这个命令获取的&#20540;可以继续被调用。而os.system不同,它只是调用,调用完后自身退出,可能返回个0吧
比如,我想得到ntpd的进程id,就要这么做:
os.popen('ps -C ntpd | grep -v CMD |awk '{ print $1 }').readlines()[0]
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1022873次
积分:11702
积分:11702
排名:第796名
原创:18篇
转载:1015篇
评论:46条
(2)(2)(3)(1)(24)(2)(9)(1)(2)(4)(16)(14)(1)(1)(3)(2)(2)(10)(14)(4)(6)(15)(6)(14)(24)(21)(9)(8)(47)(24)(11)(17)(9)(13)(8)(23)(58)(63)(57)(36)(15)(25)(3)(9)(35)(128)(34)(9)(36)(7)(27)(68)(1)(12)(9)(11)(40)(12)如何关闭os.popen_百度知道
如何关闭os.popen
print &;, stderr=PIPE)
output_lines = ps, PIPE import re
def disk_space(pattern=&quot, message=&df -h& %(message.readlines()
for line in output_lines.search(pattern:
line = line.strip());CAPACITY WARNING&quot.__main__&#39;usr&#47, shell=True, line);;2[0-9]%&quot, line)
if __name__ == &#39;%s %s&quot!&#47#:
## take shell command output
ps = Popen(&bin&#47, stdout=PIPE;env python #coding=utf-8 from subprocess import Popen
知道智能回答机器人
我是知道站内的人工智能,可高效智能地为您解答问题。很高兴为您服务。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁对于如何结束一个Python程序或者用Python操作去结束一个进程等,Python本身给出了好几种方法,而这些方式也存在着一些区别,对相关的几种方法看了并实践了下,同时也记录下。
Python 核心编程(第二版)
1. sys.exit()
执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法。
该方法中包含一个参数status,默认为0,表示正常退出,也可以为1,表示异常退出。
1 import sys
2 sys.exit()
3 sys.exit(0)
4 sys.exit(1)
该方法引发的是一个SystemExit异常(这是唯一一个不会被认为是错误的异常),当没有设置捕获这个异常将会直接退出程序执行,当然也可以捕获这个异常进行一些其他操作。
2. os._exit()
效果也是直接退出,不会抛出异常,但是其使用会受到平台的限制,但我们常用的Win32平台和基于UNIX的平台不会有所影响。
知乎上有说是调用了C 语言的 _exit() 函数(未考证)
3. os.kill()
一般用于直接Kill掉进程,但是只能在UNIX平台上有效。
基本原理:该函数是模拟传统的UNIX函数发信号给进程,其中包含两个参数:一个是进程名,即所要接收信号的进程;一个是所要进行的操作。
操作(第二个参数)的常用取值为:
SIGINT & & &终止进程 & & 中断进程
SIGTERM&& 终止进程&&&& 软件终止信号
SIGKILL & &终止进程 & & &杀死进程
SIGALRM & 闹钟信号
在linux平台上打开VLC视频播放器,然后查看运行的进程:进程号是 4497
然后执行os.kill操作:
执行完之后可以发现VLC视频播放器已经关闭,同时该进程也已经被Kill了。
4. Windows下Kill进程
既然在Linux下能够进行上述操作,那么Windows下也能够有相关的操作。
这里使用的是os.popen(), 该方法是用于直接执行系统命令,而在Windows下其实就是使用taskkill来kill掉进程,其基本形式是,
taskkill&& /pid&& 程序的PID号码
可以直接在CMD窗口下试下这个命令....
可以先打开一个计算器程序,然后使用tasklist查看该程序的pid,这里是620,所以对应的Python代码是:
1 import os
2 if __name__ == "__main__":
os.popen('taskkill.exe /pid:'+str(pid))
阅读(...) 评论()新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分3阅读权限10帖子精华可用积分3 信誉积分0 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 3, 距离下一级还需 197 积分
帖子主题精华可用积分3 信誉积分0 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
程序如下:
fi, fo, ff = os.popen3(&start C:/temp.exe&)
while True:
& & line = fi.readline()
& & if len(line) == 0:
& && &&&break
& & print line
fi.close()
while True:
& & line1 = fo.readline()
& & if len(line1) == 0:
& && &&&break
& & print line1
fo.close()
while True:
& & line2 = ff.readline()
& & if len(line2) == 0:
& && &&&break
& & print line2
ff.close()
本人通过os.popen3调用了用C++编写的一个简单的可执行文件,该可执行文件既有输入,又有输出
而我编写该程序的目的,是调用了该可执行文件之后,我想把输入和输出打印出来,但现在调试了之后什么都没有输出。
请各位大侠帮忙解决一下,本人不胜感谢!
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分44阅读权限10帖子精华可用积分44 信誉积分105 专家积分0 在线时间12 小时注册时间最后登录
白手起家, 积分 44, 距离下一级还需 156 积分
帖子主题精华可用积分44 信誉积分105 专家积分0 在线时间12 小时注册时间最后登录
论坛徽章:0
您认为python是用来做这个的么?我认为不可能实现或实现起来很麻烦。
popen3(cmd, mode='t', bufsize=-1)
& & Execute the shell command 'cmd' in a sub-process.
UID空间积分0 积分3阅读权限10帖子精华可用积分3 信誉积分0 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 3, 距离下一级还需 197 积分
帖子主题精华可用积分3 信誉积分0 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
我是用来做测试用的!
我编写的程序是把文件从源地址复制到目的地址!
现在我用python来设计测试用例,所以想得到os.popen3的返回值!
UID779179空间积分0 积分917阅读权限20帖子精华可用积分917 信誉积分102 专家积分41 在线时间14 小时注册时间最后登录
丰衣足食, 积分 917, 距离下一级还需 83 积分
帖子主题精华可用积分917 信誉积分102 专家积分41 在线时间14 小时注册时间最后登录
论坛徽章:0
原帖由 KaMakA 于
16:07 发表
您认为python是用来做这个的么?我认为不可能实现或实现起来很麻烦。
popen3(cmd, mode='t', bufsize=-1)
& & Execute the shell command 'cmd' in a sub-process.
不懂不要瞎说。
lz的popen3没有错,但是你没有往句柄里写东西,当然得不到输出了
UID空间积分0 积分3阅读权限10帖子精华可用积分3 信誉积分0 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 3, 距离下一级还需 197 积分
帖子主题精华可用积分3 信誉积分0 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
请4楼的能否说详细一点好吗?
非常感谢!
我用type()已经知道,fi,fo,ff都是file型的,但为什么里面什么都没有呢!
UID空间积分0 积分44阅读权限10帖子精华可用积分44 信誉积分105 专家积分0 在线时间12 小时注册时间最后登录
白手起家, 积分 44, 距离下一级还需 156 积分
帖子主题精华可用积分44 信誉积分105 专家积分0 在线时间12 小时注册时间最后登录
论坛徽章:0
我是一个菜鸟。
# Supply popen2 etc. (for Unix)我看到这条注释。
再加上我在linux下测试只能得到shell下的stdin, stdout, stderr。图形界面程序不可控。
所以轻易的得出错误的结论,误导了楼主。我有罪。
UID779179空间积分0 积分917阅读权限20帖子精华可用积分917 信誉积分102 专家积分41 在线时间14 小时注册时间最后登录
丰衣足食, 积分 917, 距离下一级还需 83 积分
帖子主题精华可用积分917 信誉积分102 专家积分41 在线时间14 小时注册时间最后登录
论坛徽章:0
原帖由 suxiao1999 于
17:05 发表
请4楼的能否说详细一点好吗?
非常感谢!
我用type()已经知道,fi,fo,ff都是file型的,但为什么里面什么都没有呢!
搞清楚stdin是干嘛用的,你就明白了

我要回帖

更多关于 python os.popen用法 的文章

 

随机推荐