125

呼び出しstdoutを実行した後、変数でを取得したい。os.system

例として次の行を見てみましょう。

batcmd="dir"
result = os.system(batcmd)

resultエラーコードが含まれます(上記の例では、 stderr 0Windowsまたは1一部のLinuxで)。

stdout実行されたコマンドでリダイレクトを使用せずに上記のコマンド を取得するにはどうすればよいですか?

4

6 に答える 6

154

必要なのはstdout出力だけである場合は、以下をご覧くださいsubprocess.check_output()

import subprocess

batcmd="dir"
result = subprocess.check_output(batcmd, shell=True)

を使用していたため、同じ動作を得るためos.system()に設定する必要があります。信頼できない引数をシェルに渡すことに関するセキュリティ上の懸念shell=Trueに注意する必要があります。

キャプチャも必要な場合は、呼び出しstderrに追加するだけです。stderr=subprocess.STDOUT

result = subprocess.check_output([batcmd], stderr=subprocess.STDOUT)

エラー出力をデフォルトの出力ストリームにリダイレクトします。

出力がテキストであることがわかっている場合はtext=True、返されたバイト値をプラットフォームのデフォルト エンコーディングでデコードするために追加します。encoding="..."そのコーデックが受信したデータに対して正しくない場合は、代わりに使用してください。

于 2013-09-11T11:24:23.580 に答える
8

Windows ソリューションを拡張したいと思います。Python 2.7.5 で IDLE を使用し、ファイル Expts.py からこのコードを実行すると、次のようになります。

import subprocess
r = subprocess.check_output('cmd.exe dir',shell=False) 
print r

...Python シェルでは、「cmd.exe」に対応する出力のみを取得します。「dir」の部分は無視されます。ただし、/K や /C などのスイッチを追加すると ...

import subprocess
r = subprocess.check_output('cmd.exe /K dir',shell=False) 
print r

...次に、Python シェルで、ディレクトリ リストを含め、期待するすべての情報を取得します。ウーフー!

ここで、スイッチを使用せずに、または /K スイッチを使用して DOS Python コマンド ウィンドウで同じことを試してみると、サブプロセス cmd.exe を実行していて、さらに入力を待っているため、ウィンドウがハングしているように見えます。 「終了」し、[Enter] を押して解放します。しかし、/K スイッチを使用すると、完全に機能し、python プロンプトに戻ります。よし。

さらに一歩進んだ...これはクールだと思った...代わりにExpts.pyでこれを行うと:

import subprocess
r = subprocess.call("cmd.exe dir",shell=False) 
print r

...新しいDOSウィンドウが開き、そこに残り、「dir」ではなく「cmd.exe」の結果のみが表示されます。/C スイッチを追加すると、何も表示されないうちに DOS ウィンドウが非常に速く開いたり閉じたりします (予想どおり、/C は終了すると終了します)。代わりに /K スイッチを追加すると、DOS ウィンドウが開いたままになり、ディレクトリ リストなど、期待するすべての出力が得られます。

DOS Pythonコマンドウィンドウから同じこと(subprocess.check_outputの代わりにsubprocess.call)を試してみると; すべての出力は同じウィンドウ内にあり、ポップアップ ウィンドウはありません。スイッチがないと、再び「dir」部分が無視され、プロンプトが python プロンプトから DOS プロンプトに変わります (cmd.exe サブプロセスが python で実行されているため、もう一度「exit」と入力すると、python プロンプトに戻ります)。/K スイッチを追加すると、ディレクトリ リストが出力され、プロンプトが python から DOS に変更されます。これは、/K がサブプロセスを終了しないためです。スイッチを /C に変更すると、サブプロセスが /C に従って終了するため、予期されるすべての出力が得られ、Python プロンプトに戻ります。

長々とした回答で申し訳ありませんが、このボードでは、せいぜい機能しない多くの簡潔な「回答」に不満を感じています(テストされていないためと思われます-私の上記のEduard Fの回答のように、スイッチがありません)またはさらに悪いことに、非常に簡潔でまったく役に立ちません (たとえば、「os.system の代わりに subprocess を試してください」...ええ、OK、次は??)。対照的に、私がテストしたソリューションを提供し、それらの間に微妙な違いがあることを示しました。時間がかかりましたが...これが役に立てば幸いです。

于 2014-07-12T23:53:54.320 に答える
5

commandsも機能します。

import commands
batcmd = "dir"
result = commands.getoutput(batcmd)
print result

Linux、python 2.7 で動作します。

于 2017-07-28T03:45:09.247 に答える