2

我正在编写一个 Web 应用程序,它将在本地 Windows 服务器上执行命令并需要显示输出。我代码中的 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 服务器没有有效的标准输入文件句柄(这并不奇怪,因为它是一个服务器进程)。该subprocess模块正在尝试复制该标准输入文件句柄......但失败了。

要解决此问题,请Popen使用绑定到 NUL 文件的标准输入文件句柄(也可能是标准错误)调用您正在执行的子进程。(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

标准输入的默认subprocess.Popen()值为None,它从父进程传递标准输入。

要使用内部标准输入,只需通过stdin=PIPE您的Popen()呼叫即可。

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