python执行shell命令查看输出_python 运行 shell 命令并捕获输出_python_酷徒编程知识库...

这个问题的答案取决于你使用的python 版本。 最简单的方法是使用 subprocess.check_output 函数:>>> subprocess.check_output(['ls', '-l'])

b'total 0n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 filesn'

check_output 运行一个只接受参数的程序,因为 input.1 它返回的结果与打印到 stdout 完全相同 。 如果需要将输入写入 stdin,请跳到 run 或 Popen 节。 如果要执行复杂的shell 命令,请参见这里答案末尾的shell=True 上的注释。

check_output 函数几乎适用于几乎所有的 python版本, 比如仍然广泛使用( 2.7 ).2 , 但是对于更新版本它不再是推荐的方法 。

python ( 3.5或更高)的现代版本: run

如果使用 python 3.5或更高版本,并且不需要向后兼容,则建议使用新 run 函数 。 它为 subprocess 模块提供了一个非常通用, 高级的API 。 要捕获程序的输出,请将 subprocess.PIPE 标志传递给 stdout 关键字参数。 然后访问返回的CompletedProcess 对象的stdout 属性:>>> import subprocess

>>> result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)

>>> result.stdout

b'total 0n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 filesn'

返回值是 bytes 对象,因此如果需要适当的字符串,则需要对它的进行 decode 处理。 假定被调用的进程返回一个UTF-8-encoded字符串:>>> result.stdout.decode('utf-8')

'total 0n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 filesn'

这可以全部压缩成一行:>>> subprocess.run(['ls', '-l'], stdout=subprocess.PIPE).stdout.decode('utf-8')

'total 0n-rw-r--r-- 1 memyself staff 0 Mar 14 11:04 filesn'

如果要将输入传递给进程的stdin,请将 bytes 对象传递给 input 关键字参数:>>> cmd = ['awk', 'length($0)> 5']

>>> input = 'foonfoofoon'.encode('utf-8')

>>> result = subprocess.run(cmd, stdout=subprocess.PIPE, input=input)

>>> result.stdout.decode('utf-8')

'foofoon'

通过传递 stderr=subprocess.PIPE ( 捕获到 result.stderr ) 或 stderr=subprocess.STDOUT ( 与常规输出一起捕获到 result.stdout ) 可以捕获错误。 如果不考虑安全性,你还可以通过传递 shell=True 来运行更复杂的shell 命令,如下面的注释所述。

这只是增加了一点复杂性,与以前实现的方式相比。 但我认为这是值得 : 现在你几乎可以做任何你需要做的run功能。

python ( 2.7 -3.4 )的旧版本: check_output

如果你使用的是旧版本的python,或者需要适度的向后兼容性,那么你可以使用 check_output 函数,如上面所述。 自 python 2.7以来,它已经可用。subprocess.check_output(*popenargs, **kwargs)

它采用与 Popen ( 请参见下面) 相同的参数,并返回一个包含程序输出的字符串。 这个答案的开头有一个更详细的用法示例。 在 python 3.5和更高版本中 check_output 相当于使用 check=True 和 stdout=PIPE 执行 run 并仅返回 stdout 属性 。

你可以传递 stderr=subprocess.STDOUT 以确保错误消息包含在返回的输出--中但在某些版本的 python 中将 stderr=subprocess.PIPE 传递给 check_output 会导致死锁 如果不考虑安全性,你还可以通过传递 shell=True 来运行更复杂的shell 命令,如下面的注释所述。

如果你需要从 stderr 进行管道传输或将输入传递给进程则 check_output 将无法完成任务 。 请参见下面的Popen 示例。

复杂的应用程序 & python ( 2.6和更高版本)的旧版本: Popen

如果你需要深度向后兼容性,或者如果你需要比 check_output 提供的更复杂的功能则必须直接使用 Popen 对象,这些对象封装了子进程的低级 API

Popen构造函数接受不带参数的单个命令,或者包含命令作为其第一个项目的列表,后跟任意数量的参数,每个参数作为列表中的单独项目。 shlex.split 可以帮助将字符串解析为适当格式化的列表。 Popen 对象还接受主机的不同参数用于进程管理和低级别配置 。

要发送输入和捕获输出,communicate 几乎是首选方法。 如中所示:output = subprocess.Popen(["mycmd","myarg"],

stdout=subprocess.PIPE).communicate()[0]

或者>>> import subprocess

>>> p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE,

... stderr=subprocess.PIPE)

>>> out, err = p.communicate()

>>> print out

.

..

foo

如果设置 stdin=PIPEcommunicate 还允许你通过 stdin 将数据传递给进程:>>> cmd = ['awk', 'length($0)> 5']

>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE,

... stderr=subprocess.PIPE,

... stdin=subprocess.PIPE)

>>> out, err = p.communicate('foonfoofoon')

>>> print out

foofoo

在某些情况下,你可能需要复杂的实时输出捕捉。 Vartec 回答建议的方法,但是如果不仔细使用 communicate 以外的方法容易出现死锁 。

上述所有功能一样,当安全不是一个问题时,你可以通过传递 shell=True 来运行更复杂的shell 命令。

备注

1.运行 shell 命令:shell=True 参数

通常,每个对 run 。check_output 或 Popen 构造函数的调用都执行单个程序。 那就意味着没有漂亮的bash样式管道。 如果要运行复杂的shell 命令,可以通过 shell=True,这三个函数都支持。

但是,这样做会引发安全问题 如果你做的不仅仅是轻脚本,你可能最好分别调用每个进程,并将每个进程的输出作为输入传递给下一个进程,通过run(cmd, [stdout=etc...], input=other_output)

或者Popen(cmd, [stdout=etc...]).communicate(other_output)

直接连接管道的诱惑很强;抵制它。 否则你可能会看到死锁或者不得不像这样的这样的 hacky

2.Unicode注意事项

check_output 在 python 2中返回字符串,但在 python 3中返回 bytes 对象。 如果你还没有请花点时间了解 unicode 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值