引言在写程序时,我们无法避免需要运行外部程序,相较于功能比较简单的os.system(),更加倾向于使用subprocess模块来执行外部程序 。
模块介绍subprocess.run()使用subprocess.run()执行命令的时候,父进程会一直等待直到子进程结束后才会继续运行父进程
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False)"""参数介绍 1. args: cmd命令 2. stdin: 传递参数进来 3. input: 传递参数进来,使用input的时候不能使用stdin 4. stdout: 外部程序的输出,可以指定通过管道(subprocess.PIPE) 5. stderr: 外部程序的报错输出, 可以指定通过管道(subprocess.PIPE)或者和stdout使用同一句柄(stderr=subprocess.STDOUT) 6. shell: 是否通过shell执行命令 7. timeout: 如果超时则终止子进程,该参数被传递给Popen.communicate() 8. check: 检查returncode是否为0,如果不为0则引发subprocess.CalledProcessError错误, 可以通过try....except...捕获"""实例
文章插图
文章插图
【subprocess Python编程之子进程管理详解】import subprocess as sp# 三种方式构造命令sp.run('ls -l', shell=True)sp.run(['ls', '-l'], shell=True)sp.run(' '.join(['ls', '-l']), shell=True)# 判断是否正确执行命令sp.run('ls -l', shell=True, check=True)# 获取命令的输出p = sp.run('ls -l', shell=True, check=True, stdout=sp.PIPE, stderr=sp.PIPE)print(p.stdout.read())# 使用stdin接受数据传入p1 = sp.run('ls -l', shell=True, check=True, stdout=sp.PIPE, stderr=sp.PIPE)print(p1.stdout.read())p2 = sp.run('grep lovefish', shell=True, check=True, stdin=p1.stdout, stdout=sp.PIPE, stderr=sp.PIPE)print(p2.stdout.read())例子
subprocess.Popen()subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=())"""参数介绍 1. args:cmd命令,字符串或者列表 2. bufsize:0:无缓冲; 1:行缓冲,只可以在universal_newlines=True时被使用;其他正值则为缓冲区的大小;负数则为使用系统默认缓冲 3. executable:一般不使用,用来表示shell程序 4. stdin:传递数据进来 5. stdout:命令的输出,可以指定通过管道输出(subprocess.PIPE) 6. stderr:命令的报错输出,可以通过管道(subprocess.PIPE)或者和stdout使用同一句柄输出(subprocess.STDOUT) 7. preexec_fns: 在exec之前执行 8. close_fds:如果为真,在unix下,则关闭除0,1,2之外的文件 。在windows下无法设置close_fds为真和重定向stderr和stdout 9. shell:是否通过shell执行命令 10. cwd:命令执行的工作目录 11. env:设置环境变量 12. universal_newlines:让返回数据以文本字符串输出函数介绍 1. Popen.poll():检查子进程是否结束 2. Popen.wait():等待直到子进程结束 3. Popen.communicate():内部数据交互,将数据发送给stdin,返回stdout和stderr 4. Popen.send_signal():发送信号给子进程 5. Popen.terminate():终止子进程,unix下对应SIGTERM,windows下对应TerminateProcess() 6. Popen.kill():杀死子进程,unix下对应SIGKILL,windows下和terminate()一致对象介绍 1. Popen.args:命令 2. Popen.stdout:命令的输出 3. Popen.stderr:命令的报错输出 4. Popen.stdin:命令接受的数据 5. Popen.pid:子进程的ID 6. Popen.returncode:返回值"""
经验总结扩展阅读
- python基础--简单数据类型预览
- python基础-较复杂数据类型预览
- 1 Python全栈工程师之从网页搭建入门到Flask全栈项目实战 - ES6标准入门和Flex布局
- StampedLock:一个并发编程中非常重要的票据锁
- Punched Card 编程架构演化史:远古时代,从打孔卡开始
- python的基本运用
- python-绘图与可视化
- Go的网络编程详解
- 插件化编程之WebAPI统一返回模型
- Python函数-2V2