Python执行Shell命令主要通过subprocess
模块来实现,该模块允许Python程序启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回状态。
subprocess
模块提供了多个函数来创建和管理子进程,其中最常用的是subprocess.run()
,它在Python 3.5及以上版本中可用。这个函数可以运行外部命令并等待它完成。
os.system()
,subprocess
提供了更好的错误处理和安全性。import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
try:
result = subprocess.run(['invalid_command'], check=True, capture_output=True, text=True)
except subprocess.CalledProcessError as e:
print(f"命令执行失败,返回码:{e.returncode}")
print(f"错误输出:{e.stderr}")
with open('output.txt', 'w') as f:
subprocess.run(['ls', '-l'], stdout=f)
原因:可能是由于命令阻塞了,或者需要用户交互。
解决方法:使用subprocess.Popen
并设置合适的参数,例如stdin=subprocess.PIPE
来提供输入。
import subprocess
proc = subprocess.Popen(['some_command'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stdout, stderr = proc.communicate(input=b'some_input')
原因:命令执行时间过长,超过了预期。
解决方法:使用subprocess.run()
的timeout
参数来设置超时时间。
try:
result = subprocess.run(['long_running_command'], timeout=10, capture_output=True, text=True)
except subprocess.TimeoutExpired:
print("命令执行超时")
原因:直接拼接用户输入可能导致Shell注入攻击。
解决方法:使用参数列表而不是字符串来调用命令,避免Shell注入。
# 不安全的做法
subprocess.run(f'echo {user_input}', shell=True) # 可能导致Shell注入
# 安全的做法
subprocess.run(['echo', user_input]) # 安全,不会导致Shell注入
通过以上方法,可以在Python中安全有效地执行Shell命令,并处理可能遇到的问题。
领取专属 10元无门槛券
手把手带您无忧上云