十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
前言
其实有一个模块也支持执行系统命令,那个模块就是sys.system
,但他执行系统命令会直接通过主进程去执行命令,那假如,该命令的执行需要耗费一个小时,那么主进程会
卡一个小时,而不会去干别的事,这样就会导致程序的运行效率低下。
成都创新互联始终坚持【策划先行,效果至上】的经营理念,通过多达十多年累计超上千家客户的网站建设总结了一套系统有效的全网营销解决方案,现已广泛运用于各行各业的客户,其中包括:成都展览展示等企业,备受客户赞许。
如果由subprocess
去执行系统命令
的时候并不会让主进程去执行,而是主进程会开辟出一个子进程
去执行,并不会影响到主进程
的运行,主进程
该干嘛就干嘛,那么又有个问题,大家都知道进程之间的内存空间是独立
的,也就是说进程之间
是不能相互访问
的,那么在subprocess
中,有个管道的概念,既然固定死了进程之间不能相互访问
,那么可以将执行命令的结果输出到管道里,该管道其实就是一块共享的内存空间
,可以让主进程
去获取到该共享内存空间存放的数据
subprocess基本工作原理:
subprocess简单案例
import subprocess
# 创建一个子进程去执行系统命令
obj=subprocess.Popen(
'ps -ef', # 执行的系统命令(必须是字符串格式)
shell=True, # 指定命令解释器来解释执行的这条命令
stdout=subprocess.PIPE, # 将执行的正确结果丢到管道(共享内存空间,用于进程之间共享)
stderr=subprocess.PIPE # 将执行的错误结果丢到另一个新的管道
)
'''
当从任意一个管道,例如正确或者错误结果管道中获取值,
'''
# 从正确管道中获取值
res=obj.stdout.read() # 主进程去管道里获取正确的结果
print(res.decode('utf-8')) # 获取的结果是bytes类型,需要指定decode指定编码
# 从错误管道中获取值
res2=obj.stderr.read()
print(res2.decode('utf-8'))