我有一个名为dns_poison.py的文件,该文件需要调用一个名为netscanner的软件包。当我尝试从dns_poison.py加载icmpscan模块时,出现以下消息:
ModuleNotFoundError: No module named 'icmpscan'
我已经完成了sys.path并可以确认正确的路径。这些文件位于D:\ PythonProjects \ Networking \ tools,并且在执行sys.path时出现D:\ PythonProjects。
这是我的目录结构:
dns_poison.py
netscanner/
__init__.py
icmpscan.py
文件的代码段如下:
dns_poison.py
import netscanner
netscanner \ __ init __。py
from icmpscan import ICMPScan
netscanner \ icmpscan.py
class ICMPScan:
def __init__(self, target, count=2, timeout=1):
self.target = target
self.count = count
self.timeout = timeout
self.active_hosts = []
# further code below here....
我不明白为什么它找不到模块,因为我在其他python项目上使用了完全相同的方法,没有任何问题。任何帮助将不胜感激。
答案 0 :(得分:1)
运行python dns_poison.py
时,导入程序先检查模块路径,然后检查本地目录,并最终找到具有以下可用选项的netscanner
软件包:
netscanner
netscanner.icmpscan
netscanner.icmpscan.ICMPScan
现在我问你,icmpscan
在哪里?进口商找不到,因为很好,它不存在。 PYTHONPATH
存在于dns_poison.py
所在的任何位置,并且不会附加自身以包括任何导入模块的绝对路径,因为这根本不起作用。因此可以找到netscanner
,因为它与dns_poison.py
处于同一级别,但是进口商不知道icmpscan.py
的位置,因为您没有告诉过它。因此,您有两种选择来更改__init__.py
:
from .icmpscan import ICMPScan
,可与Python 3.x一起使用from netscanner.icmpscan import ICMPScan
可与Python 2.x / 3.x一起使用为您提供的参考资料:
答案 1 :(得分:0)
最简单的思考方式是导入应相对于程序入口点文件进行处理。我个人认为这是处理导入路径的最简单,最简单的方法。
在您的示例中,我将拥有:
from netscanner.icmpscan import ICMPScan
在主文件中,而不是将其添加到 init .py。