【问题标题】:How to store the result of an executed shell command in a variable in python? [duplicate]如何将执行的shell命令的结果存储在python的变量中? [复制]
【发布时间】:2012-01-29 08:45:10
【问题描述】:

我需要将我执行的 shell 命令的结果存储在一个变量中,但我无法让它工作。我试过了:

import os    

call = os.system("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'")
print call

但它会在终端打印结果并将 call 的值打印为零,可能表示成功。如何获取存储在变量中的结果?

【问题讨论】:

标签: python linux bash shell


【解决方案1】:

改用subprocess 模块:

import subprocess
output = subprocess.check_output("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'", shell=True)

编辑:这是 Python 2.7 中的新功能。在早期版本中,这应该可以工作(命令重写如下所示):

import subprocess
output = subprocess.Popen(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'], stdout=subprocess.PIPE).communicate()[0]

作为旁注,您可以重写

cat syscall_list.txt | grep f89e7000

grep f89e7000 syscall_list.txt

您甚至可以用单个 awk 脚​​本替换整个语句:

awk '/f89e7000/ {print $2}' syscall_list.txt

导致:

import subprocess
output = subprocess.check_output(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'])

【讨论】:

  • 我正在使用 python 2.6.6,它给了我错误:AttributeError: 'module' object has no attribute 'check_output'
  • @user567879,你是对的。这个函数是在 Python 2.7 中添加的。我将在 Python 2.6 的方法中进行编辑。
  • 如果我需要将 python 变量作为参数传递给执行的 shell 命令怎么办?
  • @user567879:按照通常将变量放入列表中的方式进行操作,即['awk', '/f89e7000/ {print $2}', filename],然后将其传递给 Popen()。
【解决方案2】:

commands.getstatusoutput 适用于这种情况。 (自 Python 2.6 起已弃用)

import commands
print(commands.getstatusoutput("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'"))

【讨论】:

【解决方案3】:

os.popen 适用于此。 popen - 打开与命令之间的管道。返回值是一个连接到管道的打开文件对象,可以读取。 split('\n') 将输出转换为列表

import os
list_of_ls = os.popen("ls").read().split('\n')
print list_of_ls
import os
list_of_call = os.popen("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'").read().split('\n')
print list_of_call

【讨论】:

    【解决方案4】:

    在 python 3 中你可以使用

    import subprocess as sp
    output = sp.getoutput('whoami --version')
    print (output)
    
    ``
    

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 1970-01-01
      • 2022-10-19
      • 2018-05-11
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多