时间:2021-05-22
python的子进程嘛,就是利用python打开一个子进程(当然像是一句废话),但是可能和我们理解的不太一样。
一:如何理解?
我们可能的理解:多开一个进程运行某个python函数(如果只想实现这个功能,请使用multiprocessing包)
正确的理解:python通过shell/cmd 打开一个新的程序进程,而不限于python函数,比如我们可以开一个“ls”指令的进程列出当前文件夹下的文件,这个“ls”指令明显是一个shell通用函数,而不是python
函数:
# 打开子进程运行“ls”。输出当前文件夹下文件<br data-filtered="filtered">import subprocess
p = subprocess.run(["ls"])
二. 如何使用?
当我们想单纯地利用subprocess打开一个进程运行python函数的时候,我们甚至要迂回地去做:
比方说这样:
(1)新建一个需要运行的函数脚本 test_print.py
import sysdef print_it(a, b , c): print(a) print(b) print(c)if __name__ == "__main__": print_it(sys.argv[1], sys.argv[2], sys.argv[3])(2)再建一个脚本,通过传递参数的方式运行 test_print.py
import subprocessp = subprocess.run(["python", "test_print.py", "a1", "b2", "c3"])pp = subprocess.run(["python", "test_print.py", "d4", "e5", "f6"])(3) 输出结果:
a1
b2
c3
d4
e5
f6
三:一些简单用法
1. 比方说重定向输出:
(1)依旧是新建一个需要运行的函数脚本 test_print.py
import sysdef print_it(a, b , c): print(a) print(b) print(c)if __name__ == "__main__": print_it(sys.argv[1], sys.argv[2], sys.argv[3])(2)再建一个脚本,通过传递参数的方式运行 test_print.py
import subprocessp = subprocess.Popen(["python", "test_print.py", "a1", "b2", "c3"], stdout=subprocess.PIPE, shell=True) #shell=True 为必须,否则stdout无法读出pp = subprocess.Popen(["python", "test_print.py", "d4", "e5", "f6"], stdout=subprocess.PIPE, shell=True) print(p.stdout.read()) print(pp.stdout.read())然而此时,输出的结果是二进制文件
b'a1\r\nb2\r\nc3\r\n'
b'd4\r\ne5\r\nf6\r\n'
我们需要对此进行处理(当然你不处理也可以,就是看着别扭)
import subprocessp = subprocess.Popen(["python", "test_print.py", "a1", "b2", "c3"], stdout=subprocess.PIPE, shell=True) #shell=True 为必须,否则stdout无法读出pp = subprocess.Popen(["python", "test_print.py", "d4", "e5", "f6"], stdout=subprocess.PIPE, shell=True) # 用str转化一下就好。print(str(p.stdout.read(), encoding = "utf8"))print(str(pp.stdout.read(), encoding = "utf8"))(3)定向到外部文件
import subprocess# 注意,此步骤为必须f_handler=open('out.log', 'w')p = subprocess.run(["python", "test_print.py", "a1", "b2", "c3"], stdout=f_handler)pp = subprocess.run(["python", "test_print.py", "d4", "e5", "f6"], stdout=f_handler)# 一个错误用法p_error = subprocess.run(["python", "test_print.py", "d4", "e5", "f6"], stdout='out.log') # 这样是不行的我们会发现,屏幕上什么都不会显示,输出结果已经导入到out.log里面了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在上一篇文章中,我们讲了如何在linux上用python写一个守护进程。主要原理是利用linux的fork函数来创建一个进程,然后退出父进程运行,生成的子进程就
python的osmodule中有fork()函数用于生成子进程,生成的子进程是父进程的镜像,但是它们有各自的地址空间,子进程复制一份父进程内存给自己,两个进程
NodeJS子进程简介NodeJS子进程提供了与系统交互的重要接口,其主要API有:标准输入、标准输出及标准错误输出的接口。NodeJS子进程简介NodeJS子
python多线程和多进程区别是: 1、多线程可以共享全局变量,而多进程是不能的。 2、多线程中,所有子线程的进程号相同;多进程中不同的子进程进程号不同。
Python多进程和数据传递的理解python不仅线程用的是系统原生线程,进程也是用的原生进程进程的用法和线程大同小异importmultiprocessing