python执行脚本方式:subprocess run、Popen子进程创建
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 程序内部实现并发和并行计算,以提高程序的性能和效率。
虽然 subprocess
和 multiprocessing
都涉及多进程的操作,但它们的使用场景和目的略有不同。需要根据具体的需求来选择合适的模块。如果需要与外部进程进行交互,执行外部命令或调用其他可执行文件,可以使用 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可能会更简单。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!