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
1
2
3
4
5
6
7
|
import sys def 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
1
2
3
4
5
|
import subprocess p = 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
1
2
3
4
5
6
7
|
import sys def 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
1
2
3
4
5
6
7
|
import subprocess p = 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'
我们需要对此进行处理(当然你不处理也可以,就是看着别扭)
1
2
3
4
5
6
|
import subprocess p = 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)定向到外部文件
1
2
3
4
5
6
|
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里面了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/chenyansu/p/10772085.html