subprocess Popen使用

news/2024/11/6 3:00:18

介绍

相关的介绍在这篇博客里介绍的很好了:

http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html

这里介绍些自己的理解.


 

子进程函数

下面两个函数call, check_call是阻塞形式的调用, 即只有等子进程结束后才会进行后面的代码;

而Popen函数不是阻塞运行, 但只有等待子进程介绍后才会结束;

subprocess.call(cmd)
subprocess.check_call(cmd)
subprocess.Popen(cmd)

 

 处理子进程的函数如下,

wait是等待子进程介绍, 返回码为0则说明正常运行结束;

poll是查看子进程当前状态, 返回None则说明还在运行中;

另外两个就是终止, 杀死进程;

subprocess.wait()
subprocess.poll()
subprocess.terminate()
subprocess.kill()

 


 

Popen参数

Popen参数有很多, 参考上面的连接介绍的很好;

对于shell这个参数, 需要注意,

当shell=True的时候, 是在shell中运行, 此时 cmd 可以是字符串如下, 但如文档里说的, 该参数是存的安全隐患, 可能会被shell注入, 如 cmd = "; rm -rf /"; 

Warning:  Using shell=True can be a security hazard. See the warning under Frequently Used Arguments for details.

cmd = "tail -f text.txt"
Popen(cmd,shell=True)

所以建议是关闭shell, 此时可以如下处理:

cmd = "tail -f text.txt"
cmd = cmd.split()
Popen(cmd)

 


 

PIPE

  介绍下stdin与stdout, 这两个就是可以用来作为父进程与子进程之间通信用的, 如这里的管道PIPE, 也可以是文件 或None(直接在父进程里输出);

subprocess.PIPE功能非常强大, 但也存在一个问题, 就是如果子进程输出内容数据太多(大于65536字节), 会导致PIPE内存不足, 子进程被huang, 子进程永远无法结束, 

Note:   Do not use stdout=PIPE or stderr=PIPE with this function as that can deadlock based on the child process output volume. Use Popen with the communicate() method when you need pipes.

对于这个问题有不少人出现,并给出了相应的方法:

http://noops.me/?p=92

http://stackoverflow.com/questions/1180606/using-subprocess-popen-for-process-with-large-output

其建议有两个:

要么用文件代替stdout,

要么用communicate()及时读出文件的内容;   (对于这个处理好像不行, 文档里又这么说, 感觉说的前后矛盾

Note:  The data read is buffered in memory, so do not use this method if the data size is large or unlimited.

)

 

转载于:https://www.cnblogs.com/He2Li/p/5443237.html


http://www.niftyadmin.cn/n/3095332.html

相关文章

VMware12安装 Ubuntu desktop19

如果卡在下图,就在内存那里加大点(2G试试) 出现下图 按回车 如果是黑屏 就按Ctrlaltf5 在splash后按i—空格---nomodeset---esc--:--wq—回车

SharePoint Web Part 客户端管理工具

有些时候我们可能需要对页面上的Web Part进行一些操作, 浏览器功能比较简单, 这时候我们需要使用客户端工具来进行操作管理, 下面这个小工具就做了类似的事情. WinForm SharePoint Web Part Manager enjoy SharePoint转载于:https://www.cnblogs.com/jingnansu/p/4955281.html

Grunt打包seajs项目

在使用seajs时,常常将若干脚本分为多次require进来,这样开发中比较方便,但是,会增加http请求次数,在生产环境中需要进行打包合并、压缩等操作。 以Grunt构建工具为例,对一个seajs项目打包: 普通…

Dell R系服务器装系统(centos7)BIOS设置

如果不设置通电开机 我会用第二种安装系统 第一种 下图界面,键盘按F2 进入下图界面,点击System BIOS 进入下图界面,点击Boot Setting 进入下图界面,点击BIOS Boot Setting 进入下图界面,点击Hard-Disk Driver Sque…

GridView 弄的 StringGrid

1、 主界面 layout_main.xml &#xff1a; 1 <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"2 xmlns:tools"http://schemas.android.com/tools"3 android:layout_width"match_parent"4 android:lay…

zabbix3.0配置邮件报警

我们部署一套监控软件&#xff0c;报警这一块自然不可或缺&#xff0c;接下来我们看看zabbix如何实现邮件报警。1、编写发送邮件的脚本zabbix通脚本发送邮件&#xff0c;遵循的传参格式为&#xff1a;脚本 收件人 标题 邮件内容先来看看脚本&#xff08;sendmail_zabbix.py…

mac 键盘使用

2019独角兽企业重金招聘Python工程师标准>>> 1)按 delete 键&#xff0c;实现 Windows 键盘上退格键的功能&#xff0c;也就是删除光标之前的一个字符&#xff08;默认&#xff09;&#xff1b; 2)按 fndelete 键&#xff0c;删除光标之后的一个字符&#xff1b; 3)…

Windows与centos,centos与centos互传文件

Windows与centos相互传文件 要有个工具PentestBox&#xff08;很强大&#xff09;下面是下载链接 链接&#xff1a;https://pan.baidu.com/s/1CF7HzjiGi3wnpScphJoF3g 提取码&#xff1a;hvfm 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 安装如下(安…