KeyError: 'PROGRAMFILES'\r: 从 cgi 调用.py时



***底部更新

我正在构建一个简单的网页,用于通过CGI启动一些Python脚本。我正在使用Scapy库的一个脚本上遇到一个问题。看来,随着Scapy的进口,我遇到了一个可能的路径问题(从我所做的研究中)。从控制台或从冷冻的pyinstaller .exe中运行时,我没有这个问题。

运行Python 2.7

windows 7

上的apache

这是我从apache错误日志中获得的追溯明智(我已经清理了一些不必要的东西,以使其更容易阅读)

Traceback (most recent call last):r: 
File "C:/Apache24/cgi-bin/host-lookup-trace.py", line 3, in <module>r: 
from scapy.all import *r: 
File "C:\Python27\lib\site-packages\scapy\all.py", line 11, in 
<module>r: 
from scapy.config import *r: 
File "C:\Python27\lib\site-packages\scapy\config.py", line 15, in 
<module>r: 
from scapy.data import *r: 
File "C:\Python27\lib\site-packages\scapy\data.py", line 240, in 
<module>r: 
MANUFDB = load_manuf(os.environ["ProgramFiles"] + 
"\\wireshark\\manuf")r: 
File "C:\Python27\lib\os.py", line 425, in __getitem__r: 
return self.data[key.upper()]r: 
KeyError: 'PROGRAMFILES'r: 

在我的外壳中,我得到

os.environ["ProgramFiles"]
'C:\Program Files'

作为测试,我在scapy data.py文件中进行了以下操作

#MANUFDB = load_manuf(os.environ["ProgramFiles"] + "\wireshark\manuf")
 MANUFDB = load_manuf("C:\\Program Files\\wireshark\\manuf")

os.environ的同样错误,现在在另一个电话中:

Traceback (most recent call last):r: 
File "C:/Apache24/cgi-bin/host-lookup-trace.py", line 3, in <module>r:
from scapy.all import *r: 
File "C:\Python27\lib\site-packages\scapy\all.py", line 16, in 
<module>r: 
from scapy.arch import *r: 
File "C:\Python27\lib\site-packages\scapy\arch\__init__.py", line 70, 
in <module>r: 
from scapy.arch.windows import *r: 
File "C:\Python27\lib\site-packages\scapy\arch\windows\__init__.py", 
line 317, in <module>r: 
conf.prog = WinProgPath()r: 
File "C:\Python27\lib\site-packages\scapy\arch\windows\__init__.py", 
line 288, in __init__r: 
self._reload()r: 
File "C:\Python27\lib\site-packages\scapy\arch\windows\__init__.py", 
line 301, in _reloadr: 
self.wireshark = win_find_exe("wireshark", "wireshark")r: 
File "C:\Python27\lib\site-packages\scapy\arch\windows\__init__.py", 
line 277, in win_find_exer: 
path = _where(fn, dirs=[os.path.join(os.environ[env], installsubdir)])r: 
File "C:\Python27\lib\os.py", line 425, in __getitem__r: 
[return self.data[key.upper()]r: 
KeyError: 'PROGRAMFILES'r: 

希望这里的伟大思想能帮助我进入底部!我可以根据要求发布任何其他信息。

***更新

我拿出了进口Scapy系,我只是试图导入OS,然后打印OS.Environ String。我会遇到相同的错误,只是不确定为什么要从CGI中调用此错误。

<type 'exceptions.KeyError'>    Python 2.7.13: C:Python27Python.exe
Wed Dec 20 16:04:55 2017
A problem occurred in a Python script. Here is the sequence of function 
calls leading up to the error, in the order they occurred.
C:Apache24cgi-binhost-lookup-trace.py in ()
32 print '<input type = "submit" value = "Submit Selected Host" />'
33 print '</form>' 
=>  34 print os.environ["ProgramFiles"]
35 print '<body>nn'
36 print '</html>nn'
os = <module 'os' from 'C:Python27libos.pyc'>, os.environ = 
{'HTTP_REFERER': 'http://127.0.0.1/host-lookup-t...'1', 
'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br'}
C:Python27libos.py in __getitem__(self={'HTTP_REFERER': 
'http://127.0.0.1/host-lookup-t...'1', 'HTTP_ACCEPT_ENCODING': 'gzip, 
deflate, br'}, key='ProgramFiles')
423                 self.data[key.upper()] = item
424             def __getitem__(self, key):
=>  425                 return self.data[key.upper()]
426             try:
427                 unsetenv
self = {'HTTP_REFERER': 'http://127.0.0.1/host-lookup-t...'1', 
'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br'}, self.data = {'COMSPEC': 
r'C:WINDOWSsystem32cmd.exe', 'CONTENT_LENGTH': '26', 'CONTENT_TYPE': 
'application/x-www-form-urlencoded', 'CONTEXT_DOCUMENT_ROOT': 
'c:/Apache24/cgi-bin/', 'CONTEXT_PREFIX': '/cgi-bin/', 'DOCUMENT_ROOT': 
'C:/Apache24/htdocs', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTP_ACCEPT': 

'text/html,application/xhtml xml,application/xml; q = 0.9,image/webp,image/apng,/ ; q = 0.8','http_accept_encoding':'gzip,deflate,br','http_accept_language': 'en-us,en; q = 0.9',...},key ='programFiles',key.upper = :'ProgramFiles' args =('programFiles',) 消息='programfiles'

您的问题是:

return self.data[key.upper()]

您提到可以做到这一点:

os.environ["ProgramFiles"]

,但请注意,密钥是"ProgramFiles",而不是"PROGRAMFILES"。当您执行key.upper()时,即使是正确的"ProgramFiles"字符串,您也要采取任何键

编辑:和评论 1:到处所有r是什么?

编辑2:没关系,似乎不是这种情况

由于OS.Environ正在为调用脚本的CGI/HTML实例拉动环境变量,因此它没有dict中的" programFiles"条目 - 因此keyError。

要修复它,我添加了

os.environ["ProgramFiles"] = 'C:\Program Files'

高于我的进口scapy。

我不知道这是正确的方法,但是对于我想要做的事情,它可以使用

最新更新