web-dev-qa-db-ja.com

実行されたシェルコマンドの結果をPythonの変数に保存する方法は?

実行したシェルコマンドの結果を変数に保存する必要がありますが、動作させることができませんでした。私は次のように試しました:

import os    

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

ただし、結果をターミナルに出力し、callの値をゼロとして出力し、場合によっては成功を示します。結果を変数に保存する方法は?

22
user567879

代わりに 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'])
40
Rob Wouters

commands.getstatusoutput は、この状況に適しています。 (Python 2.6)以降非推奨

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

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

python 3で使用できます

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

``
0
Prakash D