Python 中执行外部命令的几种方法,以及它们各自的优缺点。

传统方法:os.system()

Python
import os
os.system("dir")
os.system("echo Hello")
exitCode = os.system("echotypo")
  • os.system() 函数是最简单的执行外部命令的方法,它直接调用系统的 shell 来执行指定的命令。
  • 优点: 使用简单,容易理解。
  • 缺点: 功能有限,无法获取命令的输出结果和详细的错误信息。返回值是 shell 的退出状态码,而不是命令的执行结果。

现代方法:subprocess 模块

Python
import subprocess
subprocess.call(["echo", "Hello"])
exitCode = subprocess.call(["dir", "nonexistent"])
Python
import subprocess
process = subprocess.Popen(["echo","Hello"], stdout=subprocess.PIPE)
for line in process.stdout:
   print(line.rstrip())
  • subprocess 模块是 Python 2.4 引入的,它提供了更强大、更灵活的方式来执行外部命令
  • subprocess.call() 函数用于执行命令,并返回命令的退出状态码。
  • subprocess.Popen() 可以用于更复杂的操作,例如获取命令的输出结果、控制命令的输入等。
  • 优点: 功能强大,可以获取命令的输出结果和详细的错误信息,可以进行更精细的控制。
  • 缺点: 使用稍微复杂一些,需要学习 subprocess 模块的用法。

传统方法:popen2 模块

Python
import popen2
readStream, writeStream, errorStream = popen2.popen3("dir")
# allLines = readStream.readlines()
for line in readStream:
  print(line.rstrip())
readStream.close()
writeStream.close()
errorStream.close()
  • popen2 模块也可以用于执行外部命令并读取其输出,但它已经被 subprocess 模块所取代。
  • 优点: 可以获取命令的输出结果。
  • 缺点: 已经被 subprocess 模块取代,不建议使用。

总结

  • 在 Python 中执行外部命令,推荐使用 subprocess 模块,它提供了更强大、更灵活的功能。
  • os.system() 函数虽然简单,但功能有限,只适合执行简单的命令。
  • popen2 模块已经被 subprocess 模块取代,不建议使用。

关键词

  • 系统命令
  • shell 命令
  • 进程
  • 反引号(在某些 shell 中,反引号可以用于执行命令)
  • 管道(用于将一个命令的输出作为另一个命令的输入)

希望这段翻译对您有所帮助!

Last modified: Friday, 31 January 2025, 1:21 AM