一.标准输出和标准错误有一个缓存的概念,它不会立即将程序的标准输出内容返回,而是会做一定的缓存,直到缓存满或者程序结束强制清空缓存时才输出。了解到问题的原因,解决问题的方法也就一目了然了,我们只需要在子程序中,每次输出后去手动清空一下缓存即可
###1.新建子程序one.py import sys import time for i in range(5): sys.stdout.write("woshini%s\n"%(i)) time.sleep(1) for i in range(5): sys.stderr.write('Error {}\n'.format(i)) time.sleep(1)
###2.主程序mains.py import shlex import subprocess if __name__ == '__main__': shell_cmd = 'python one.py' #此处是启动子程序one.py的命令 cmd = shlex.split(shell_cmd) p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) while p.poll() is None: line = p.stdout.readline() #readline()并非获取一行数据,而是获取一条 line = line.strip() if line: print(line) #实时获取返回的数据 if p.returncode == 0: print('Subprogram success') else: print('Subprogram failed')
二.命令行传参
###主程序mains.py cmd = "python one.py {} {} {}".format("郑州","地铁","一号") proc = subprocess.Popen(args=cmd, stdout=subprocess.PIPE) output = proc.stdout.read().decode() #凡是在控制台上输出的内容都能获取到
### one.py print("脚本名:", sys.argv[0]) #one.py print(sys.argv[1]) #郑州 print(sys.argv[2]) #地铁 print(sys.argv[3]) #一号
#因为以上输出都是在控制台,所以stdout.read()都能读取到