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可能会更简单。

模块主要用于创建和管理子进程,通过调用外部程序或命令来实现与子进程的交互。它可以执行系统命令、调用其他可执行文件,并提供了获取子进程输出、输入和错误信息的功能。如果需要与外部进程进行交互,执行外部命令或调用其他可执行文件,可以使用。模块,你可以在 Python 程序中执行系统命令、调用其他可执行文件,甚至与其他编程语言编写的程序进行交互。模块执行外部命令时,要谨慎处理输入参数,确保安全性,并避免潜在的安全风险,尤其是在使用。模块都提供了在 Python 中处理多进程的功能,但它们的使用场景和目的略有不同。 一个允许您以非阻塞方式从龙卷风 Web 应用程序生成子进程的模块。 def print_res( status, stdout, stderr, has_timed_out ) : if status == 0: print "OK:" print stdout else: print "ERROR:" print stderr t = Subprocess( print_res, timeout=30, args=[ "cat", "/etc/passwd" ] ) t.start() #start tornado t.ioloop.start()
pythonsubprocess模块subprocess.runsubprocess.getoutput,subprocess.Popensubprocess.call的使用
这段代码可以用来启动一个新的 Python 进程,并执行指定的 Python 文件。具体来说,它使用 subprocess 模块的 Popen 函数创建一个新的进程,然后将 "python" 和指定的文件名作为参数传递给 Popen 函数。 这个新的进程会启动一个新的 Python 解释器,并执行指定的文件。如果指定的文件包含一个可执行Python 脚本,那么这个脚本将会被执行。如果文件没有可执行Python 代码,那么这个进程将会启动一个空的 Python 解释器。 需要注意的是,这个函数调用将会阻塞当前进程,直到新的进程执行完成。如果您希望在启动新进程的同时继续执行当前进程,可以使用 subprocess 模块的其他函数,例如 subprocess.call 或 subprocess.run。这些函数可以等待新的进程执行完成并返回结果,而不会阻塞当前进程。