私はPythonでシステムコールを作成し、Pythonプログラムで操作できる文字列に出力を保存しようとしています。
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
私はここにいくつかの提案を含むいくつかのことを試しました:
しかし運がありません。
私はPythonでシステムコールを作成し、Pythonプログラムで操作できる文字列に出力を保存しようとしています。
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
私はここにいくつかの提案を含むいくつかのことを試しました:
しかし運がありません。
回答:
Python 2.7またはPython 3の場合
Popen
オブジェクトを直接作成する代わりに、subprocess.check_output()
関数を使用してコマンドの出力を文字列に保存できます。
from subprocess import check_output
out = check_output(["ntpq", "-p"])
Python 2.4-2.6の場合
communicate
メソッドを使用します。
import subprocess
p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE)
out, err = p.communicate()
out
あなたが欲しいものです。
他の回答についての重要な注意
コマンドをどのように渡したかに注意してください。この"ntpq -p"
例は別の問題を提起します。以来Popen
シェルを起動していない、あなたは、コマンドとオプション]のリストを使用します["ntpq", "-p"]
。
Popen.communicate
。プロセスが終了するまで戻りません。
p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocess.check_output()
返します。結果を印刷するだけの場合は、違いはありません。ただし、結果などのメソッドを使用する場合は、まずオブジェクトをデコードする必要があります(たとえば)。bytes
str
myString.split("\n")
bytes
subprocess.check_output(myParams).decode("utf-8")
universal_newlines=True
パラメータとして追加すると、Python 3で文字列オブジェクトを取得するのに役立ちました。universal_newlinesがTrueの場合、デフォルトのエンコーディングでテキストモードで開かれます。それ以外の場合は、バイナリストリームとして開かれます。
これは私にとってstdoutをリダイレクトするために機能しました(stderrも同様に処理できます):
from subprocess import Popen, PIPE
pipe = Popen(path, stdout=PIPE)
text = pipe.communicate()[0]
うまくいかない場合は、発生している問題を正確に明記してください。
\n
。
pipe.returncode == 0
最後の行の後で確認することもできます。
Popen
は、とのタプルを返すためです。アクセスするstdout
とstderr
、[0]
を取得するだけですstdout
。あなたも行うことができtext, err = pipe.communicate()
、その後、text
あなたは何を期待しています
これpwd
が単なる例だとすると、次のようになります。
import subprocess
p = subprocess.Popen("pwd", stdout=subprocess.PIPE)
result = p.communicate()[0]
print result
別の例と詳細については、サブプロセスのドキュメントを参照してください。
subprocess.Popen:http : //docs.python.org/2/library/subprocess.html#subprocess.Popen
import subprocess
command = "ntpq -p" # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)
#Launch the shell command:
output = process.communicate()
print output[0]
PopenコンストラクターでshellがTrueの場合、コマンドをシーケンスではなく文字列として渡す必要があります。それ以外の場合は、コマンドをリストに分割するだけです。
command = ["ntpq", "-p"] # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None)
あなたはpopenの初期化に、また標準誤差を読み取るために必要がある場合は、設定することができます標準エラー出力をするsubprocess.PIPEかにsubprocess.STDOUT:
import subprocess
command = "ntpq -p" # the shell command
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
#Launch the shell command:
output, error = process.communicate()
Python 2.7以降の場合、慣用的な答えは subprocess.check_output()
サブプロセスを呼び出すときの引数の処理にも注意してください。少し混乱する可能性があります。...
argsが単一のコマンドで、独自のargsがない場合(またはユーザーがshell=True
設定した場合)は、文字列にすることができます。それ以外の場合はリストでなければなりません。
たとえば... ls
コマンドを呼び出すには、これで問題ありません。
from subprocess import check_call
check_call('ls')
これもそうです:
from subprocess import check_call
check_call(['ls',])
ただし、シェルコマンドに引数を渡したい場合は、次のことはできません。
from subprocess import check_call
check_call('ls -al')
代わりに、リストとして渡す必要があります。
from subprocess import check_call
check_call(['ls', '-al'])
このshlex.split()
関数は、サブプロセスを作成する前に文字列をシェルのような構文に分割するのに役立つ場合があります...このように:
from subprocess import check_call
import shlex
check_call(shlex.split('ls -al'))
これは私にとって完璧に機能します:
import subprocess
try:
#prints results and merges stdout and std
result = subprocess.check_output("echo %USERNAME%", stderr=subprocess.STDOUT, shell=True)
print result
#causes error and merges stdout and stderr
result = subprocess.check_output("copy testfds", stderr=subprocess.STDOUT, shell=True)
except subprocess.CalledProcessError, ex: # error code <> 0
print "--------error------"
print ex.cmd
print ex.message
print ex.returncode
print ex.output # contains stdout and stderr together
これは私にぴったりでした。タプルの戻りコード、stdoutおよびstderrを取得します。
from subprocess import Popen, PIPE
def console(cmd):
p = Popen(cmd, shell=True, stdout=PIPE)
out, err = p.communicate()
return (p.returncode, out, err)
例えば:
result = console('ls -l')
print 'returncode: %s' % result[0]
print 'output: %s' % result[1]
print 'error: %s' % result[2]
受け入れられた答えは依然として良好であり、新しい機能についてのほんの一部のコメントです。Python 3.6以降ではcheck_output
、エンコーディングをで直接処理できます。ドキュメントを参照してください。これは今すぐ文字列オブジェクトを返します:
import subprocess
out = subprocess.check_output(["ls", "-l"], encoding="utf-8")
Python 3.7では、パラメーターcapture_output
がsubprocess.run()に追加されました。これにより、Popen / PIPE処理の一部が実行されます。pythonのドキュメントを参照してください。
import subprocess
p2 = subprocess.run(["ls", "-l"], capture_output=True, encoding="utf-8")
p2.stdout
import os
list = os.popen('pwd').read()
この場合、リストには1つの要素しかありません。
os.popen
subprocess
モジュールのために廃止予定です。
以下は、プロセスのstdoutとstderrを単一の変数にキャプチャします。Python 2および3と互換性があります。
from subprocess import check_output, CalledProcessError, STDOUT
command = ["ls", "-l"]
try:
output = check_output(command, stderr=STDOUT).decode()
success = True
except CalledProcessError as e:
output = e.output.decode()
success = False
コマンドが配列ではなく文字列である場合は、これに次の接頭辞を付けます。
import shlex
command = shlex.split(command)
Python 3.5の場合、私は以前の回答に基づいて関数を設定しました。ログが削除されている可能性があります。
import shlex
from subprocess import check_output, CalledProcessError, STDOUT
def cmdline(command):
log("cmdline:{}".format(command))
cmdArr = shlex.split(command)
try:
output = check_output(cmdArr, stderr=STDOUT).decode()
log("Success:{}".format(output))
except (CalledProcessError) as e:
output = e.output.decode()
log("Fail:{}".format(output))
except (Exception) as e:
output = str(e);
log("Fail:{}".format(e))
return str(output)
def log(msg):
msg = str(msg)
d_date = datetime.datetime.now()
now = str(d_date.strftime("%Y-%m-%d %H:%M:%S"))
print(now + " " + msg)
if ("LOG_FILE" in globals()):
with open(LOG_FILE, "a") as myfile:
myfile.write(now + " " + msg + "\n")
使用ckeck_output
方法subprocess
import subprocess
address = 192.168.x.x
res = subprocess.check_output(['ping', address, '-c', '3'])
最後に文字列を解析します
for line in res.splitlines():
それが役に立てば幸いです、幸せなコーディング
"ntpq -p"
です。あなたが尋ねているよりも問題。