pythonスクリプト内からコマンドラインプログラムを実行して、出力を取得したいと考えています。
スクリプトで使用できるように、fooによって表示される情報を取得するにはどうすればよいですか?
たとえば、コマンドラインから_foo file1
_を呼び出すと、出力されます
_Size: 3KB
Name: file1.txt
Other stuff: blah
_
filename = os.system('foo file1')
のようなファイル名を取得するにはどうすればよいですか?
サブプロセスモジュールを使用します。
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番目のパラメーターはオプションであり、削除できます。
Pythonスクリプトを通じて呼び出されるツールの出力を取得する最も簡単な方法は、標準ライブラリの subprocess モジュールを使用することです。- subprocess.check_output 。
>>> subprocess.check_output("echo \"foo\"", Shell=True)
'foo\n'
(ツールが信頼できないソースから入力を取得する場合は、Shell=True
引数を使用しないようにしてください。)
これは通常、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
これは純粋な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'])
Pythonでは、スペース、サブクォート、改行を含むプレーンなOSコマンドをsubcommand
モジュールに渡すことができるため、次のように応答テキストを解析できます。
これを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;
次に、次のように実行します。
python test.py
どのプリント:
this echo command has subquotes, spaces,
and newlines!
これが機能しない場合は、pythonバージョンまたはオペレーティングシステムに問題がある可能性があります。UbuntuではPython 2.7.3を使用しています。この例では12.10。