web-dev-qa-db-ja.com

Pythonプログラム内からコマンドラインからデータを取得する方法は?

pythonスクリプト内からコマンドラインプログラムを実行して、出力を取得したいと考えています。

スクリプトで使用できるように、fooによって表示される情報を取得するにはどうすればよいですか?

たとえば、コマンドラインから_foo file1_を呼び出すと、出力されます

_Size: 3KB
Name: file1.txt
Other stuff: blah
_

filename = os.system('foo file1')のようなファイル名を取得するにはどうすればよいですか?

29
user1058492

サブプロセスモジュールを使用します。

import subprocess

command = ['ls', '-l']
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.IGNORE)
text = p.stdout.read()
retcode = p.wait()

次に、変数textを使用して、正規表現や分割など、好きなことができます。

subprocess.Popenの2番目と3番目のパラメーターはオプションであり、削除できます。

23
koblas

Pythonスクリプトを通じて呼び出されるツールの出力を取得する最も簡単な方法は、標準ライブラリの subprocess モジュールを使用することです。- subprocess.check_output

>>> subprocess.check_output("echo \"foo\"", Shell=True)
'foo\n'

(ツールが信頼できないソースから入力を取得する場合は、Shell=True引数を使用しないようにしてください。)

5
josePhoenix

これは通常、pythonで実行できるbashスクリプトの主題です。

#!/bin/bash
# vim:ts=4:sw=4

for arg; do
    size=$(du -sh "$arg" | awk '{print $1}')
    date=$(stat -c "%y" "$arg")
    cat<<EOF
Size: $size
Name: ${arg##*/}
Date: $date 
EOF

done

編集:使い方:疑似端末を開いて、これをコピーして貼り付けます:

cd
wget http://pastie.org/pastes/2900209/download -O info-files.bash

Python2.4では:

import os
import sys

myvar = ("/bin/bash ~/info-files.bash '{}'").format(sys.argv[1])
myoutput = os.system(myvar) # myoutput variable contains the whole output from the Shell
print myoutput
2
Gilles Quenot

これは純粋なpython:

import os
import stat
import time

# pick a file you have ...
file_name = 'll.py'
file_stats = os.stat(file_name)

# create a dictionary to hold file info
file_info = {
    'fname': file_name,
    'fsize': file_stats [stat.ST_SIZE],
    'f_lm': time.strftime("%m/%d/%Y %I:%M:%S %p",time.localtime(file_stats[stat.ST_MTIME])),
}


print("""
Size: {} bytes
Name: {}
Time: {}
 """
).format(file_info['fsize'], file_info['fname'], file_info['f_lm'])
1
Gilles Quenot

Pythonでは、スペース、サブクォート、改行を含むプレーンなOSコマンドをsubcommandモジュールに渡すことができるため、次のように応答テキストを解析できます。

  1. これをtest.pyに保存します。

    #!/usr/bin/python
    import subprocess
    
    command = ('echo "this echo command' + 
    ' has subquotes, spaces,\n\n" && echo "and newlines!"')
    
    p = subprocess.Popen(command, universal_newlines=True, 
    Shell=True, stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE)
    text = p.stdout.read()
    retcode = p.wait()
    print text;
    
  2. 次に、次のように実行します。

    python test.py 
    
  3. どのプリント:

    this echo command has subquotes, spaces,
    
    
    and newlines!
    

これが機能しない場合は、pythonバージョンまたはオペレーティングシステムに問題がある可能性があります。UbuntuではPython 2.7.3を使用しています。この例では12.10。

1
Eric Leschinski