执行系统命令首选subprocess模块,因其功能全面、安全性高且支持精细控制;os.system()和os.popen()虽简单但功能有限,易引发安全风险,适用于简单场景;使用时需避免shell注入、注意编码和资源管理。

Python执行系统命令,在我看来,主要有那么几板斧:最直接的
os.system()
os.popen()
subprocess
subprocess
当我们需要在Python程序里调用外部命令时,选择哪种方式,其实是功能需求和便捷性之间的一个权衡。
1. os.system(command)
import os
# 执行一个简单的命令
return_code = os.system("ls -l /tmp")
print(f"命令退出码: {return_code}")
# 执行一个不存在的命令
return_code_fail = os.system("non_existent_command")
print(f"失败命令退出码: {return_code_fail}")2. os.popen(command, mode='r', buffering=-1)
os.popen()
import os
# 获取命令输出
with os.popen("df -h") as f:
output = f.read()
print("磁盘使用情况:")
print(output)
# 也可以写入,但通常不这么用
# with os.popen("grep python", mode='w') as f:
# f.write("python is great\n")
# f.write("java is also great\n")3. subprocess
subprocess
*`subprocess.run(args, , stdin=None, input=None, capture_output=False, text=None, check=False, shell=False, timeout=None, encoding=None, errors=None, env=None, cwd=None, ...)
** 这是Python 3.5+ 推荐的、最通用的方式。它执行命令,等待其完成,并返回一个
import subprocess
# 简单执行并捕获输出
result = subprocess.run(["ls", "-l", "/tmp"], capture_output=True, text=True)
print("命令输出:")
print(result.stdout)
print("命令错误输出:")
print(result.stderr)
print(f"退出码: {result.returncode}")
# 捕获输出并检查错误 (check=True 会在非零退出码时抛出 CalledProcessError)
try:
result_checked = subprocess.run(
["cat", "/non_existent_file"],
capture_output=True,
text=True,
check=True
)
print(result_checked.stdout)
except subprocess.CalledProcessError as e:
print(f"命令执行失败: {e.returncode}")
print(f"错误信息: {e.stderr}")
# 通过 shell=True 执行,但要小心安全问题
# result_shell = subprocess.run("echo $PATH", shell=True, capture_output=True, text=True)
# print(f"PATH: {result_shell.stdout}")*`subprocess.call(args, , shell=False, ...)
** 功能上有点像
立即学习“Python免费学习笔记(深入)”;
*`subprocess.check_call(args, , shell=False, ...)
** 与
类似,但如果命令返回非零退出码,会抛出
*`subprocess.check_output(args, , shell=False, ...)
** 执行命令并返回其标准输出(以字节串形式),如果命令返回非零退出码,同样会抛出
*`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=(), , group=None, extra_groups=None, user=None, umask=-1, encoding=None, errors=None, text=None)
** 这是
模块中最底层的接口,提供了对子进程的完全控制。你可以用它来启动一个子进程,然后通过
import subprocess
# 启动一个进程,但不立即等待其完成
process = subprocess.Popen(["ping", "-c", "4", "google.com"], stdout=subprocess.PIPE, text=True)
# 可以做其他事情...
print("后台pinging中...")
# 等待进程完成并获取输出
stdout, stderr = process.communicate()
print("Ping结果:")
print(stdout)
print(f"退出码: {process.returncode}")说实话,现在在新的Python项目里,我很少会主动去用
os.system()
os.popen()
os.system()
os.system("my_script.sh")os.popen()
os.system()
ls
df
subprocess
with
subprocess
CompletedProcess
我觉得
subprocess
首先,全面的输入输出控制是它最大的亮点。你可以轻松地将命令的标准输出(stdout)、标准错误(stderr)重定向到管道(pipe)进行捕获,甚至可以将文件内容作为标准输入传递给子进程。这对于需要与外部程序进行复杂交互的场景(比如,运行一个命令行工具并传入大量参数,然后解析其返回的JSON或CSV数据)来说,简直是神来之笔。
subprocess.run()
CompletedProcess
stdout
stderr
returncode
其次,精细的错误处理是
subprocess
check=True
CalledProcessError
try...except
再者,安全性和灵活性也值得一提。当
shell=False
subprocess
|
>
shell=True
subprocess.Popen
总的来说,
subprocess
subprocess
在Python里执行系统命令,虽然方便,但确实有一些坑,特别是安全方面的,稍不留神就可能踩进去。
一个最常见的陷阱就是shell注入。当你使用
subprocess.run(command_string, shell=True)
os.system(command_string)
command_string
rm -rf /tmp/user_data
user_data; rm -rf /
shell=True
# 这是一个非常危险的例子,切勿在生产环境使用!
user_input = "my_file; echo '恶意代码被执行了!'"
# subprocess.run(f"echo {user_input}", shell=True) # 危险!正确的做法是尽量避免使用
shell=True
subprocess.run()
subprocess.Popen()
# 安全的做法 user_input = "my_file; echo '恶意代码被执行了!'" subprocess.run(["echo", user_input]) # 这里的 user_input 只是一个参数,不会被执行
另一个需要注意的点是编码问题。特别是在Windows系统上,或者处理一些非UTF-8编码的输出时,
subprocess
subprocess.run()
text=True
encoding
encoding='gbk'
阻塞与非阻塞也是一个考量。
os.system()
os.popen()
subprocess.run()
subprocess.call()
subprocess.check_call()
subprocess.check_output()
subprocess.Popen
最后,资源管理。如果你用
subprocess.Popen
process.wait()
总之,执行系统命令是把双刃剑,它赋予了Python强大的能力,但也带来了潜在的风险。理解这些陷阱并采取正确的预防措施,才能让你的代码既强大又安全。
以上就是python怎么执行系统命令_python执行系统命令方法汇总的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号