Python中执行程序或调用系统命令的方法

Python中执行程序或调用系统命令的方法

技术背景

在Python编程中,有时需要执行外部程序或调用系统命令来完成特定任务,如文件操作、系统管理等。Python提供了多种方式来实现这一需求。

实现步骤

使用subprocess.run

在Python 3.5及以上版本,推荐使用subprocess.run。它返回一个CompletedProcess对象,示例代码如下:

1
2
3
4
import subprocess
from shlex import split

completed_process = subprocess.run(split('python --version'))

使用os.system

os.system可以直接执行系统命令,但它存在安全风险,示例代码如下:

1
2
import os
os.system('ls -l')

使用os.popen

os.popen会返回一个类文件对象,可用于访问进程的标准输入/输出,示例代码如下:

1
2
import os
print(os.popen('ls -l').read())

使用subprocess.Popen

subprocess.Popenos.popen的替代方案,功能更强大但稍复杂,示例代码如下:

1
2
import subprocess
print(subprocess.Popen('echo Hello World', shell=True, stdout=subprocess.PIPE).stdout.read())

使用subprocess.call

subprocess.callPopen类似,但它会等待命令执行完成并返回返回码,示例代码如下:

1
2
import subprocess
return_code = subprocess.call('echo Hello World', shell=True)

核心代码

subprocess.run示例

1
2
3
4
5
6
7
8
9
10
import subprocess
from shlex import split

# 执行命令
completed_process = subprocess.run(split('python --version'))
print(completed_process)

# 捕获输出
completed_process = subprocess.run(split('python --version'), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(completed_process.stdout)

os.system示例

1
2
import os
os.system('ls -l')

最佳实践

  • 优先使用subprocess.run,因为它是Python 3.5及以上版本推荐的方法,安全且功能强大。
  • 避免使用os.system,除非命令完全来自可信任的常量,因为它存在安全风险。
  • 当需要与进程进行交互或控制时,使用subprocess.Popen

常见问题

FileNotFoundError: [Errno 2] No such file or directory

这通常是因为在不使用shell=True时,直接传递了命令字符串,应使用列表形式,如["ls", "-a"],或者设置shell=True

TypeError: [...] NoneType [...]

检查是否设置了capture_output=True,否则result.stderrresult.stdout将为None

TypeError: a bytes-like object is required, not [...]

程序返回的结果通常是字节类型,如果想作为普通字符串处理,设置text=True

subprocess.CalledProcessError: Command ' [...] ' returned non-zero exit status 1

命令执行失败,可以禁用返回码检查或检查实际程序的有效性。

TypeError: __init__() got an unexpected keyword argument [...]

可能使用的Python版本低于3.7.0,建议更新到最新版本,或者参考其他替代解决方案。


Python中执行程序或调用系统命令的方法
https://119291.xyz/posts/2025-05-07.python-execute-system-commands/
作者
ww
发布于
2025年5月7日
许可协议