博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python_多进程_subprocess(含标准输入、输出、错误输出)
阅读量:5334 次
发布时间:2019-06-15

本文共 4140 字,大约阅读时间需要 13 分钟。

多进程_subprocess

一、说明

subprocess为新启动的子进程,不是主进程

cmd的命令的返回结果,会存进pip所在的缓存区域里

 

统计文件有多少行 wc -l a.txt

ls -al|wc -l#ls的命令执行的结果通过管道流给了wc命令去使用

#ls的结果存在了缓存区域,后面的命令可以直接在缓存里取到

 

>>> import subprocess>>> a = subprocess.Popen('mkdir subprocesstest',shell=True,cwd='e:\\test')#Popen,cwd是当前路径下 #参数说明:shell命令;是否用shell命令执行;路径
 

 

二、实例:列出文件目录的内容

1、Windows下执行:

subprocess.run(args=['dir','test'],shell=True,cwd="e:\\")#dir是命令,后面的test是参数

运行结果:

2、linux下执行

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

 

三、Subprocess 模块的基本使用方法通过管道执行python命令

import subprocessobj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)obj.stdin.write(b"print(1);")#无;会有报错obj.stdin.write(b"print(2);")#无;obj.stdin.write(b"print(3);")#无;obj.stdin.write(b"print(4);")#无;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)

运行结果:(print代码行有误时:无;)

 

运行结果:(print代码行正确时:有;)

import subprocessobj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)obj.stdin.write(b"print(1)\n")obj.stdin.write(b"print(2)\n")obj.stdin.write(b"print(3)\n")obj.stdin.write(b"print(4)\n")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)

运行结果:

 

 

另一种写法

 

import subprocessobj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)obj.stdin.write(b"print(1)\n")obj.stdin.write(b"print(2)\n")obj.stdin.write(b"print(3)\n")obj.stdin.write(b"print(4)\n")out_info,out_error = obj.communicate()#简单写法,out_info:标准输出print(out_info,out_error)

运行结果:

四、 linux下执行两个命令:

import subprocesschild1 = subprocess.Popen(["cat","/home/wxh/a.py"], stdout=subprocess.PIPE)child2 = subprocess.Popen(["wc","-l"],stdin=child1.stdout, stdout=subprocess.PIPE)#输入内容是子进程1的输出内容
out = child2.communicate()print(out)

运行结果:

五、Subprocess进程通信实例

 

 

import subprocessimport osclass Shell(object) :  def runCmd(self, cmd) :    res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)    # 获取子进程的标准输出,标准错误信息    sout, serr = res.communicate()     #sout:执行命令后的输出内容,serr出错内容,res.pid为进程编号    return res.returncode, sout, serr, res.pid shell = Shell()fp = open('e:\\ip.txt', 'r',encoding="utf-8")ipList = fp.readlines()fp.close()fp = open('e:\\ping.txt', 'a',encoding="utf-8")print(ipList)for i in ipList :  i = i.strip()  result = shell.runCmd('ping ' + i)  if result[0] == 0 :    w = i + ' : 0'    fp.write(w + '\n')  else :    w = i + ' : 1'    fp.write(w + '\n')  #print( result[1].decode("gbk"))fp.close()

 

数据文件内容:

Ip.txt

www.baidu.comwww.taobao.com123.45.5.34127.0.0.1

六、设置日志输出到控制台

 

#encoding=utf-8import multiprocessingimport loggingimport sysdef worker():    print('I am working....')    sys.stdout.flush()#让日志信息立即输出,一般是累积到一定程度之后才输出
if __name__ == '__main__':    # 设置日志输出到控制台    multiprocessing.log_to_stderr()    logger = multiprocessing.get_logger()    # 设置输出日志的级别(info/error)    logger.setLevel(logging.INFO)    p = multiprocessing.Process(target = worker)    p.start()    p.join()

 

运行结果参照:

七、守护进程(子进程、主进程共同进退)

 

#encoding=utf-8import multiprocessingimport time, loggingimport sys #守护进程的方法def daemon():  p = multiprocessing.current_process()  print('Starting:', p.name, p.pid)  sys.stdout.flush() # 将缓冲区数据写入终端  # time.sleep(2)  print('Exiting :', p.name, p.pid)  sys.stdout.flush() #非守护进程的方法def non_daemon():  p = multiprocessing.current_process()  print('Starting:', p.name, p.pid)  sys.stdout.flush()  print('Exiting :', p.name, p.pid)  sys.stdout.flush()if __name__ == '__main__':  # 设置日志输出到控制台  multiprocessing.log_to_stderr()  logger = multiprocessing.get_logger()  # 设置输出日志的级别  logger.setLevel(logging.DEBUG)  d = multiprocessing.Process(name='daemon', target=daemon)  d.daemon = True#是守护进程  n = multiprocessing.Process(name='non-daemon', target=non_daemon)  n.daemon = False#非守护进程  d.start()  time.sleep(1)  n.start()  # d.join(1)  # n.join()  print('d.is_alive()', d.is_alive())  print("n.is_alive()", n.is_alive())  print("main Process end!")

运行结果:

 

转载于:https://www.cnblogs.com/rychh/articles/11386508.html

你可能感兴趣的文章
MySQLdb & pymsql
查看>>
zju 2744 回文字符 hdu 1544
查看>>
delphi 内嵌汇编例子
查看>>
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>
前端笔记-bom
查看>>
MATLAB作图方法与技巧(一)
查看>>
上海淮海中路上苹果旗舰店门口欲砸一台IMAC电脑维权
查看>>
Google透露Android Market恶意程序扫描服务
查看>>
给mysql数据库字段值拼接前缀或后缀。 concat()函数
查看>>
迷宫问题
查看>>
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
泛型子类_属性类型_重写方法类型
查看>>
eclipse-将同一个文件分屏显示
查看>>
对闭包的理解
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
windows编程ASCII问题
查看>>
.net webService代理类
查看>>
Code Snippet
查看>>
Node.js Express项目搭建
查看>>