Python子进程subpocess原理及用法解析

作者:陈严肃 时间:2021-10-11 19:18:27 

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 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


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


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


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'

我们需要对此进行处理(当然你不处理也可以,就是看着别扭)


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)定向到外部文件


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

标签:Python,子,进程,sub,pocess
0
投稿

猜你喜欢

  • 详解Python如何利用Pandas与NumPy进行数据清洗

    2021-07-21 15:04:34
  • 实例讲解Python中SocketServer模块处理网络请求的用法

    2021-04-16 13:25:27
  • ubuntu16.04制作vim和python3的开发环境

    2022-08-11 00:11:07
  • 详解Python字符串切片

    2021-09-10 05:10:43
  • onerror图片失效时显示其他图片

    2008-08-11 21:05:00
  • 如何使用pyinstaller打包多个和单个python文件详解

    2023-03-30 10:48:26
  • display:inline问题小结

    2008-05-01 13:08:00
  • 区别div和span、relative和absolute、display和visibility

    2009-12-13 12:18:00
  • Python机器学习之逻辑回归

    2023-11-18 14:19:02
  • python出现RuntimeError错误问题及解决

    2022-01-01 00:58:08
  • MySQL安全性指南(3)(转)

    2010-07-26 13:07:00
  • python常见字符串处理函数与用法汇总

    2023-10-19 08:07:11
  • Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)

    2021-07-10 10:35:25
  • Python中使用Frozenset对象的案例详解

    2023-09-27 09:36:32
  • Python编程使用DRF实现一次性验证码OTP

    2021-07-30 00:25:26
  • Python实现向好友发送微信消息

    2021-11-11 18:33:02
  • python中创建一个包并引用使用的操作方法

    2023-05-19 03:06:09
  • PyCharm代码回滚,恢复历史版本的解决方法

    2021-01-08 21:19:55
  • Javascript实现通过选择周数显示开始日和结束日的实现代码

    2023-08-23 13:44:52
  • python标准日志模块logging的使用方法

    2022-10-29 19:08:16
  • asp之家 网络编程 m.aspxhome.com