如何在Python生成的网页上显示stdout?

How do you display stdout on a web page generated by Python?

我正在编写一个Web应用程序,它将在本地Windows服务器上执行命令并需要显示输出。 我的代码中的Popen()调用在Python解释器上执行正常,但在通过IIS执行时会出现令人讨厌的错误。 谢谢!!!!

错误文字:

Traceback (most recent call last):

File"C:\pythonapps\mystdout.py", line 9, in print Popen('ipconfig',
shell=True, stdout=PIPE).communicate()[0]

File"C:\Python27\lib\subprocess.py", line 672, in init errread,
errwrite) = self._get_handles(stdin, stdout, stderr)

File"C:\Python27\lib\subprocess.py", line 774, in _get_handles
p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE)

WindowsError: [Error 6] The handle is invalid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from subprocess import *

print"Content-type:text/html



"

print"<html>"
print"<head>"
print"FSPCT app"
print"</head>"
print"<body>"
print Popen('ipconfig', shell=True, stdout=PIPE).communicate()[0]
print"</body>"
print"</html>"


stdin的默认subprocess.Popen()值是None,它从父进程传递stdin。

要使用内部标准输入,只需通过Popen()调用传递stdin=PIPE即可。

1
print Popen('ipconfig', shell=True, stdin=PIPE, stdout=PIPE).communicate()[0]

看起来IIS服务器没有有效的stdin文件句柄(并不是那么令人惊讶,因为它是一个服务器进程)。 subprocess模块正在尝试复制该stdin文件句柄...并且失败。

要解决此问题,请使用绑定到NUL文件的stdin文件句柄(也可能是stderr以获得良好的度量)调用Popen来执行您正在执行的子进程。 (os.devnull是在Python 2.7中引用该文件的可移植方式。)所述NUL文件(或Unix下的/ dev / null)只是丢弃写入它的所有内容,并在读取时立即返回文件结尾。完美的这一点。

尝试像这样修改你的代码:

1
2
3
4
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参数,以便更简洁地执行相同的操作。)