subprocess模块 执行系统命令

import subprocess

#call,执行系统命令,只执行命令,不能拿到内容

ret = subprocess.call("ls")

print(ret)#打印一个返回码,并不是命令返回内容

 

#执行命令,如果执行状态码是0,返回0,否则抛出异常

subprocess.check_call(["ls","-l"])

 

#执行命令,如果状态码是0,返回执行结果,否则抛出异常

ret = subprocess.check_output(["echo","hello world!"])

 

注意:

subprocess.call(["ls","-l"],shell=False)

subprocess.call("ls -l",shell=True)

如果shell=True,前面的命令就可以按字符串去写,如果shell=false,那么前面的命令带空格的就需要分开写,并放进列表中  

 

复杂的shell命令:

subprocess.Popen()

#在/home/dev/下创建test目录

obj = subprocess.Popen("mkdir test",shell=True,cwd="/home/dev")

 

#示例:

 

import subprocess

#三个PIPE是三个管道,stdin从python输出到shell,stdout从shell返回到python,stderr返回错误通道。universal_newlines换行符参数

obj = subprocess.Popen(["python"], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE,universal_newlines=True)

obj.stdin.write("print(1)\n")
obj.stdin.write("print(2)")
obj.stdin.close()

cmd_out = obj.stdout.read()
obj.stdout.close()
cmd_error = obj.stderr.read()
obj.stderr.close()

print(cmd_out)
print(cmd_error)

 

输出:

1
2
 
#另外,可以直接用communicate()得到stdout和stderr的拼接
import subprocess
obj = subprocess.Popen(["python"], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE,universal_newlines=True)

obj.stdin.write("print(1)\n")
obj.stdin.write("print(2)")

out_err_lis = obj.communicate()   #communicate()把上面所有的命令都执行
print(out_err_lis)
输出:
('1\n2\n', '')
 
#communicate()也可以执行单条命令:
out = obj.communicate(print("hello"))

  

 
posted @ 2018-08-28 18:09  greenfan  阅读(550)  评论(0)    收藏  举报