python执行脚本方式:subprocess run、Popen子进程创建

2023-12-14 01:07:10

1、概念解释

subprocess 是 Python 标准库中的一个模块,用于在 Python 程序中创建和管理子进程。它提供了执行外部命令、与子进程进行交互以及获取子进程的输出等功能。

通过 subprocess 模块,你可以在 Python 程序中执行系统命令、调用其他可执行文件,甚至与其他编程语言编写的程序进行交互。

以下是 subprocess 模块的一些常用函数和类:

  • subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, text=None, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, env=None):运行指定的命令或可执行文件,等待其执行完成,并返回一个 CompletedProcess 对象,包含执行结果。

  • subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None):启动一个子进程来执行指定的命令或可执行文件,并返回一个 Popen 对象,可以通过该对象与子进程进行交互。

  • subprocess.PIPE:常量,用于指示创建管道,即在 Popen 对象中将子进程的标准输入、标准输出或标准错误输出与管道连接起来,以便进行数据交换。

除了上述常用的函数和常量外,subprocess 模块还提供了其他用于控制子进程执行环境、处理输入输出、传递环境变量等的功能。你可以根据具体需求参考官方文档或其他资源了解更多细节和用法。

需要注意的是,在使用 subprocess 模块执行外部命令时,要谨慎处理输入参数,确保安全性,并避免潜在的安全风险,尤其是在使用 shell=True 时要格外小心。

subprocess.run 是阻塞的,会一直卡着等待程序运行
subprocess.Popen 后台执行,不阻塞

cwd可以指定创建子进程运行在那个指定目录下

command =" wandb disabled && yolo classify train data=/mnt/data/yolo/datasets/cifar10_copy1 model=/mnt/data/loong/classify/yolov8n-cls.pt epochs=10 imgsz=32 device=1  > /mnt/data/loong/classify/kk3.log 2>&1 "

result = subprocess.Popen(command, shell=True,cwd='/mnt/data/loong/classify')

2、subprocess 模块和 multiprocessing 模块区别

参考:https://blog.csdn.net/weixin_42357472/article/details/131473458

另外subprocess 模块和 multiprocessing 模块都提供了在 Python 中处理多进程的功能,但它们的使用场景和目的略有不同。

subprocess 模块主要用于创建和管理子进程,通过调用外部程序或命令来实现与子进程的交互。它可以执行系统命令、调用其他可执行文件,并提供了获取子进程输出、输入和错误信息的功能。subprocess 模块适用于与外部进程进行通信,如执行系统命令、启动其他工具或调用其他编程语言编写的程序。

multiprocessing 模块则专注于在 Python 中创建和管理多个并行的进程。它提供了创建进程、进程间通信、进程同步等功能,使得在 Python 程序中可以方便地实现并行计算和任务分发。multiprocessing 模块适用于在 Python 程序内部实现并发和并行计算,以提高程序的性能和效率。

虽然 subprocessmultiprocessing 都涉及多进程的操作,但它们的使用场景和目的略有不同。需要根据具体的需求来选择合适的模块。如果需要与外部进程进行交互,执行外部命令或调用其他可执行文件,可以使用 subprocess 模块。如果需要在 Python 内部实现并行计算和任务分发,可以使用 multiprocessing 模块。

3、os.system和subprocess区别

控制和灵活性:subprocess模块提供了更多的方法和选项来控制和管理子进程。例如,你可以设置标准输入、输出和错误输出的处理方式,甚至可以发送信号给子进程。而os.system的功能相对较少,只能执行命令并返回命令的退出状态。

处理输出:subprocess模块可以更方便地处理命令的输出。例如,你可以使用subprocess.Popen的stdout和stderr参数来捕获命令的输出和错误信息。而os.system则无法直接获取命令的输出,只能通过在命令字符串中使用重定向来处理输出。

阻塞性:os.system函数在执行命令时会阻塞Python程序,直到命令执行完毕。而subprocess模块提供了非阻塞的方式执行命令,例如使用subprocess.Popen的communicate方法。

处理复杂命令:subprocess模块更适合处理复杂的命令,如带有管道和重定向的命令。而os.system在处理这类命令时可能会遇到困难。

编码问题:当命令的参数或返回结果包含非ASCII字符时,subprocess模块通常能更好地处理编码问题。

总的来说,subprocess模块相比os.system提供了更多的功能和更大的灵活性,因此在大多数情况下,推荐使用subprocess模块来执行系统命令。然而,如果你的需求很简单,只是需要执行一个命令并获取其退出状态,那么使用os.system可能会更简单。

文章来源:https://blog.csdn.net/weixin_42357472/article/details/134977875
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。