2

ローカル Windows サーバーでコマンドを実行し、出力を表示する必要がある Web アプリケーションを作成しています。コード内の Popen() 呼び出しは、Python インタープリターでは正常に実行されますが、IIS 経由で実行すると厄介なエラーが発生します。ありがとう!!!!

エラー テキスト:

トレースバック (最新の呼び出しが最後):

ファイル「C:\pythonapps\mystdout.py」、9 行目、印刷 Popen('ipconfig', shell=True, stdout=PIPE).communicate()[0]

ファイル "C:\Python27\lib\subprocess.py"、672 行目、init errread、errwrite) = self._get_handles(stdin、stdout、stderr)

ファイル「C:\Python27\lib\subprocess.py」、774 行目、_get_handles 内 p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE)

WindowsError: [エラー 6] ハンドルが無効です

from subprocess import *

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>FSPCT app</title>"
print "</head>"
print "<body>"
print Popen('ipconfig', shell=True, stdout=PIPE).communicate()[0]
print "</body>"
print "</html>"
4

2 に答える 2

2

IIS サーバーに有効な stdin ファイル ハンドルがないようです (これはサーバー プロセスであるため、それほど驚くべきことではありません)。subprocessモジュールはその stdin ファイル ハンドルをコピーしようとしています...そして失敗しています。

これを修正するPopenには、NUL ファイルにバインドされた stdin ファイル ハンドル (および適切な測定のために stderr も) を使用して実行しているサブプロセスを呼び出します。(os.devnull は、Python 2.7 でそのファイルを参照するための移植可能な方法です。) 上記の NUL ファイル (または Unix では /dev/null) は、書き込まれたすべてのものを単純に破棄し、読み取るとすぐにファイルの終わりを返します。これに最適です。

次のようにコードを変更してみてください。

import os
...
with open(os.devnull, 'r+') as nul:
    print Popen('ipconfig', shell=True, stdin=nul, stdout=PIPE, stderr=nul).communicate()[0]

(次期 Python 3.3 では、subprocess.DEVNULL を Popen の stdin、stdout、または stderr 引数に渡して、同じことをより簡潔に行うことができるようになりました。)

于 2012-04-05T21:18:12.947 に答える
2

stdinのデフォルトのsubprocess.Popen()値はNoneで、親プロセスから stdin を渡します。

内部標準入力を使用するにはstdin=PIPEPopen()呼び出しで渡すだけです。

print Popen('ipconfig', shell=True, stdin=PIPE, stdout=PIPE).communicate()[0]
于 2012-04-05T21:29:50.410 に答える