python subprocess

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# 专门用于执行系统命令
import subprocess

#call():执行命令,并返回执行状态
#ret = subprocess.call('ipconfig')

# Popen():
# 使用场景:1.将一个进程的执行输出作为另一个进程的输入
# 2.先进入到某个输入环境,然后再执行一系列的指令
# 参数:args:shell命令,可以是字符串,或者序列类型,如list,tuple。
# bufsize:缓冲区大小,可不用关心
# stdin,stdout,stderr:分别表示程序的标准输入,标准输出及标准错误
# shell:为False时,命令需要通过列表的方式传入,当shell为True时,可直接传入命令
# cwd:用于设置子进程的当前目录
# env:用于指定子进程的环境变量。如果env=None,则默认从父进程继承环境变量
# universal_newlines:不同系统的的换行符不同,当该参数设定为true时,则表示使用\n作为换行符

# 案例1:在D:/python 下创建一个hakuna的文件夹
#subprocess.Popen('mkdir hakuna',shell=True,cwd='D:/python')

#案例2:

# 这里在本机用3.6跑 会出错:TypeError: a bytes-like object is required, not 'str'
# 所以用bytes类型
sub = subprocess.Popen(["python"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
pp = 'print(33) \n'.encode()
qq = 'print(44) \n'.encode()
sub.stdin.write(pp)
sub.stdin.write(qq)
sub.stdin.close()

# out = sub.stdout.read().decode()
# sub.stdout.close()
# error = sub.stderr.read().decode()
# sub.stderr.close()
#
# print(out)
# print(error)

##上面获取输出的东西时,可以简化为communicate(),其内部仍然是调用以上代码
out_error_list = sub.communicate() ##获取到的是一个tuple
print(out_error_list[0].decode())
posted @ 2018-04-22 21:00  wuxinyan  阅读(157)  评论(0编辑  收藏  举报