python - KeyError:'PROGRAMFILES'\ r:从cgi

时间:2017-12-20 21:56:22

标签: python python-2.7

***在底部更新

我正在构建一个简单的网页,我用它来通过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: 

在我的shell中,我得到了

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 _reload\r: 
self.wireshark = win_find_exe("wireshark", "wireshark")\r: 

File "C:\\Python27\\lib\\site-packages\\scapy\\arch\\windows\\__init__.py", 
line 277, in win_find_exe\r: 
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: 

希望这里的伟大思想可以帮助我深究这一点!我可以按要求发布任何进一步的信息。

*** UPDATE

我拿出导入scapy行,我只是尝试导入os然后打印os.environ字符串。我得到了同样的错误,只是不确定为什么从cgi中调用它会打破这个。

<type 'exceptions.KeyError'>    Python 2.7.13: C:\Python27\Python.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:\Apache24\cgi-bin\host-lookup-trace.py in ()
32 print '<input type = \"submit\" value = \"Submit Selected Host\" />'
33 print '</form>' 
=>  34 print os.environ["ProgramFiles"]
35 print '<body>\n\n'
36 print '</html>\n\n'
os = <module 'os' from 'C:\Python27\lib\os.pyc'>, os.environ = 
{'HTTP_REFERER': 'http://127.0.0.1/host-lookup-t...'1', 
'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br'}
C:\Python27\lib\os.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:\WINDOWS\system32\cmd.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': 

文本/ html,应用/ XHTML + xml的,应用/ XML; Q = 0.9,图像/ WEBP,图像/ 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',)     message ='PROGRAMFILES'

2 个答案:

答案 0 :(得分:0)

你的问题是:

return self.data[key.upper()]

你提到你可以这样做:

os.environ["ProgramFiles"]

但请注意,密钥为"ProgramFiles",而不是"PROGRAMFILES"。当您执行key.upper()时,即使它是正确的"ProgramFiles"字符串,您也会接受您传入的任何密钥,并且您正在完成所有操作大写

编辑:评论+1:所有\r到处都是什么?

编辑2:没关系,似乎不是这样的

答案 1 :(得分:0)

由于os.environ正在为调用脚本的cgi / html实例提取环境变量,因此它在dict中没有“ProgramFiles”条目 - 因此KeyError。

为了解决这个问题,我添加了

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

高于我的导入scapy。

我不知道这是正确的方法,但是我希望这样做有效