python学习之subprocess模块
subprocess.Popen
这个模块主要就提供一个类Popen:
class 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 |
字符串或者列表 |
bufsize |
0 无缓冲 |
executable |
一般不用吧,args字符串或列表第一项表示程序名 |
stdin |
None 没有任何重定向,继承父进程 |
preexec_fn |
钩子函数, 在fork和exec之间执行。(unix) |
close_fds |
unix 下执行新进程前是否关闭0/1/2之外的文件 |
shell |
为真的话 |
cwd |
设置工作目录 |
env |
设置环境变量 |
universal_newlines |
各种换行符统一处理成 '\n' |
startupinfo |
window下传递给CreateProcess的结构体 |
creationflags |
windows下,传递CREATE_NEW_CONSOLE创建自己的控制台窗口 |
- 当初最感到困扰的就是 args 参数。可以是一个字符串,可以是一个列表。
subprocess.Popen(["gedit","abc.txt"]) subprocess.Popen("gedit abc.txt")
这两个之中,后者将不会工作。因为如果是一个字符串的话,必须是程序的路径才可以。(考虑unix的api函数 exec,接受的是字符串列表)
- 但是下面的可以工作
subprocess.Popen("gedit abc.txt", shell=True)
这是因为它相当于
subprocess.Popen(["/bin/sh", "-c", "gedit abc.txt"])
都成了sh的参数,就无所谓了
- 在Windows下,下面的却又是可以工作的
subprocess.Popen(["notepad.exe", "abc.txt"]) subprocess.Popen("notepad.exe abc.txt")
这是由于windows下的api函数CreateProcess接受的是一个字符串。即使是列表形式的参数,也需要先合并成字符串再传递给api函数。
- 类似上面
subprocess.Popen("notepad.exe abc.txt" shell=True)
等价于
subprocess.Popen("cmd.exe /C "+"notepad.exe abc.txt" shell=True)
subprocess.call*
模块还提供了几个便利函数(这本身也算是很好的Popen的使用例子了)
- call() 执行程序,并等待它完成
def call(*popenargs, **kwargs): return Popen(*popenargs, **kwargs).wait()
- check_call() 调用前面的call,如果返回值非零,则抛出异常
def check_call(*popenargs, **kwargs): retcode = call(*popenargs, **kwargs) if retcode: cmd = kwargs.get("args") raise CalledProcessError(retcode, cmd) return 0
- check_output() 执行程序,并返回其标准输出
def check_output(*popenargs, **kwargs): process = Popen(*popenargs, stdout=PIPE, **kwargs) output, unused_err = process.communicate() retcode = process.poll() if retcode: cmd = kwargs.get("args") raise CalledProcessError(retcode, cmd, output=output) return output
Popen对象
该对象提供有不少方法函数可用。而且前面已经用到了wait()/poll()/communicate()
poll() |
检查是否结束,设置返回值 |
wait() |
等待结束,设置返回值 |
communicate() |
参数是标准输入,返回标准输出和标准出错 |
send_signal() |
发送信号 (主要在unix下有用) |
terminate() |
终止进程,unix对应的SIGTERM信号,windows下调用api函数TerminateProcess() |
kill() |
杀死进程(unix对应SIGKILL信号),windows下同上 |
stdin |
参数中指定PIPE时,有用 |
pid |
进程id |
returncode |
进程返回值 |
参考
转载于:https://www.cnblogs.com/zmlctt/p/4226584.html
python学习之subprocess模块相关推荐
- Python学习笔记:第三方模块2
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- python学习总结----时间模块 and 虚拟环境(了解)
python学习总结----时间模块 and 虚拟环境(了解) time- sleep:休眠指定的秒数(可以是小数) - time:获取时间戳# 获取时间戳(从1970-01-01 00:00:00到 ...
- Python学习笔记13_模块
Python学习笔记13_模块 文章目录 Python学习笔记13_模块 1.导入模块和的方法及使用 2.分层的文件系统中常用的包结构 3.OS 模块 4.sys 模块 5.math 模块 6.ran ...
- Python学习笔记:模块
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- python学习,pip 模块-数据库(mysql)-excel操作-写日志-邮件-md5加密
#模块 # 标准模块 # python自带的 # 第三方模块 # pymysql # 自己写的python文件 # 导入模块的实质 # import my_model # 把导入的模块运行了一遍 # ...
- Python学习 Day 025 -模块相关
主要内容: 1. 模块 2. import 3. from xxx import xxx 1.模块 (1)模块的概述 模块就是一个包含了python定义和声明的文件, 文件名就是模块的名字加上. ...
- Python学习笔记011_模块_标准库_第三方库的安装
容器 -> 数据的封装 函数 -> 语句的封装 类 -> 方法和属性的封装 模块 -> 模块就是程序 , 保存每个.py文件 # 创建了一个hello.py的文件,它的内容如下 ...
- Python学习笔记——glob模块【文件、路径操作】
最近做了一个将dicom文件转化为mhd文件的任务,由于要进行批量转化所以遍历文件夹必不可少,刚开始学习python编程,所以把用过的模块用法记录下来,以加深记忆,方便查阅,最后参考前人的博客做了gl ...
- Python 学习笔记 -- pickle模块,如何腌制泡菜(入门级)
#关于腌菜的基础操作 #一般情况下学会腌菜的技术可以使文件大小更加小巧,更加持久. #下来是就是一些腌菜的基础用法 import pickle, os #在腌菜之前需要导入腌菜模块#实例一:这是一个保 ...
最新文章
- 关于seo优化的核心思想
- unable to contact ip driver
- JAVA 学到什么水平就可以转战 Android 了?
- 微软官方上线的Python教程,7个章节就把Python说通了!
- ROS笔记(14) URDF
- 4095: 韩信点兵
- Python知识点入门笔记——特色数据类型(字典)
- 音乐混音怎么做?教你完美制作野狼disco与周杰伦双节棍合唱!
- android 点击后退按钮,android – 按下后退按钮后重新选择正确的NavigationView菜单项...
- java json nf_什么是JSON ,API,GET,POST请求
- 个人游戏开发者是如何盈利
- yarn安装详细教程说明、升级教程、修改yarn的全局和缓存目录、yarn基本命令
- kubeedge源码分析
- Lombok 的作者,成功讨伐 IntelliJ IDEA!
- 详解交换机的GVRP
- NOIP(普及组):AK的故事之英语学习篇
- HBUOJ--走台阶
- 微博个人信息多维度详解
- quil-ediotr编辑器工具栏图表鼠标悬浮提示
- Java实现约瑟夫环问题