重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
前言
创新互联服务项目包括灵台网站建设、灵台网站制作、灵台网页制作以及灵台网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,灵台网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到灵台省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!其实有一个模块也支持执行系统命令,那个模块就是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'))