***在底部更新
我正在构建一个简单的网页,我用它来通过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'
答案 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。
我不知道这是正确的方法,但是我希望这样做有效