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"))

浙公网安备 33010602011771号