1、()
阻塞
屏幕会打印命令的输出
返回命令结果码
# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
pass
print('开始')
ret1 = ('python')
print('ret1:{}'.format(ret1))
ret2 = ('java -version')
print('ret2:{}'.format(ret2))
print('结束')
运行
可能有人理解阻塞是因为运行了python,因此我尝试两个命令都用java -version
# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
pass
print('开始')
ret1 = ('java -version')
print('ret1:{}'.format(ret1))
ret2 = ('java -version')
print('ret2:{}'.format(ret2))
print('结束')
运行
2、()
阻塞或不阻塞
屏幕不会打印出命令的输出
返回文件对象,可用read,readline读取
不阻塞时:
# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
pass
print('开始')
('python')
ret2 = ('java -version')
print('结束')
运行(程序很快打印开始和结束,就像只用了两个print语句一样快)
阻塞时:
# -*- encoding=utf-8 -*-
import os
if __name__ == '__main__':
pass
print('开始')
ret1 = ('python')
print(())
ret2 = ('java -version')
print(())
print('结束')
运行
3、
python2.+中使用
需要到linux运行
阻塞或者非阻塞
屏幕不会打印出命令的输出
非阻塞时
# -*- encoding=utf-8 -*-
import commands
if __name__ == '__main__':
pass
print('开始')
ret1 = ('python')
ret2 = ('java -version')
print('结束')
运行
阻塞时:
# -*- encoding=utf-8 -*-
import commands
if __name__ == '__main__':
pass
print('开始')
ret1 = ('python')
print ret1[0]
print ret1[1]
print '=============='
ret2 = ('java -version')
print ret2[0]
print ret2[1]
print '=============='
print('结束')
运行
4、subprocess中Popen
阻塞或非阻塞,同上面一样,通过是否读取IO决定是否阻塞
屏幕会打印出命令的输出
可通过stdout,stderr参数指定输出或错误打印到文件
# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
pass
print('开始')
s1 = ('python')
()
s2 = ('java -version')
()
print('结束')
运行
、 输出到文件
通过文件对象来输出到文件中
# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
pass
print('开始')
with open('', 'w') as f:
s1 = ('python', stdout=f, ) # 指定输出重定向到文件
(10) # 超过10秒还没执行完会抛出异常
with open('', 'w') as f:
s2 = ('java -version', stdout=f, stderr=f) # 指定输出和错误都重定向到文件
()
print('结束')
运行后可看到文件已经写入,屏幕不打印。需要注意是stdout还是stderr。
、捕获输出和错误
PIPE通过开一个新的管道来接收运行状态
# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
pass
print('开始')
s1 = ('java -version', stdout=, stderr=)
(10) # 超过10秒还没执行完会抛出异常
print() # 结果码
print(()) # 已经执行结束返回结果码,否则返回None
std1 = ()
print('std_out:{}'.format(std1))
std2 = ()
print('std_err:{}'.format(std2))
print('结束')
运行
5、
用来替代
阻塞
# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
pass
print('开始')
s1 = ('java -version', )
print(s1)
s2 = ('python', )
print(s2)
s3 = ('python', timeout=3) # 超时抛出异常
print(s3)
print('结束')
6、check_call()和check_output()
都会检查结果码,不是0就抛出异常
check_call()返回状态码
check_output()返回输出
# -*- encoding=utf-8 -*-
import subprocess
if __name__ == '__main__':
pass
print('开始')
s1 = ('java -version', )
print(s1)
s2 = ('java -version', )
print(s2)
print('结束')
运行
使用上面提到的三个方法:call()、check_call() 和 check_output() 时,尽量不要将参数stderr和stdout设置为 ,这几个函数默认都会等待子进程完成,子进程产生大量的输出数据如果造成管道堵塞,父进程再等待子进程完成可能造成死锁。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。