python执行shell命令

举报
kwan的解忧杂货铺 发表于 2024/08/25 00:30:37 2024/08/25
【摘要】 在 Python 编程中,有时我们需要执行一些 shell 命令来完成特定的任务,比如文件操作、系统调用等。Python 提供了多种内建的方法来执行这些命令,每种方法都有其适用场景和特点。 1. os.system()os.system()是执行 shell 命令的最简单方法。它接受一个字符串作为命令,并在 shell 中执行。返回值是命令的退出状态码,通常 0 表示成功,非 0 表示失败。...

在 Python 编程中,有时我们需要执行一些 shell 命令来完成特定的任务,比如文件操作、系统调用等。Python 提供了多种内建的方法来执行这些命令,每种方法都有其适用场景和特点。

1. os.system()

os.system()是执行 shell 命令的最简单方法。它接受一个字符串作为命令,并在 shell 中执行。返回值是命令的退出状态码,通常 0 表示成功,非 0 表示失败。

import os
result = os.system('ls -l')
print("Exit status:", result)

特点:

  • 简单易用。
  • 无法获取命令的输出或错误信息。
  • 无法处理命令的超时。

2. subprocess.run()

subprocess.run()是推荐的方式,因为它提供了更多的灵活性和功能。它可以执行命令,并且可以捕获输出和错误信息。

import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print("Output:", result.stdout)

特点:

  • 可以捕获输出和错误。
  • 可以设置超时。
  • 可以检查命令的退出状态。

3. subprocess.Popen()

subprocess.Popen()提供了更细粒度的控制,允许执行命令并与之交互。它返回一个Popen对象,可以用于进一步操作。

import subprocess
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = process.communicate()
print("Output:", stdout)
if process.returncode != 0:
    print("Error:", stderr)

特点:

  • 可以实时获取输出和错误。
  • 可以控制进程的输入、输出和错误流。
  • 可以等待或轮询进程的完成。

4. os.popen()

os.popen()用于执行命令并读取输出。它返回一个文件对象,可以像普通文件一样读取。

with os.popen('ls -l') as stream:
    print(stream.read())

特点:

  • 简单易用,适用于只读取输出的场景。
  • 不能捕获错误信息。

5. subprocess.check_output()

subprocess.check_output()用于执行命令并获取输出。如果命令返回非零退出状态码,会抛出异常。

from subprocess import check_output
output = check_output(['ls', '-l'], text=True)
print("Output:", output)

特点:

  • 直接获取命令输出。
  • 如果命令失败,会抛出异常,便于错误处理。

6. subprocess.call()

subprocess.call()执行一个命令并等待其完成,返回命令的退出状态码。

import subprocess
status = subprocess.call(['ls', '-l'])
print("Exit status:", status)

特点:

  • 简单易用,只返回退出状态码。
  • 不能捕获输出或错误信息。

使用建议

在选择执行 shell 命令的方法时,应根据具体需求来决定使用哪种方法。如果需要捕获输出和错误信息,推荐使用subprocess.run()subprocess.Popen()。如果只是简单地执行命令并获取退出状态,os.system()subprocess.call()可能更合适。

此外,使用这些方法时,还需要注意异常和错误的处理,特别是当命令失败时。subprocess模块因其强大的控制和灵活性,已成为执行 shell 命令的首选方式。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。