我有一个名为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项目中使用了完全相同的方法,没有任何问题。任何帮助都将不胜感激。
发布于 2019-05-22 06:17:25
当您运行python dns_poison.py
时,导入器检查模块路径,然后检查本地目录,并最终找到包含以下内容的netscanner
包:
netscanner
netscanner.icmpscan
netscanner.icmpscan.ICMPScan
现在我问你,icmpscan
在哪里?进口商找不到,因为它不存在。PYTHONPATH
存在于dns_poison.py
所在的任何位置,并且不会附加自身来包含任何导入模块的绝对路径,因为这根本不是它的工作方式。所以可以找到netscanner
,因为它与dns_poison.py
处于同一级别,但是导入器不知道icmpscan.py
存在的位置,因为您没有告诉它。因此,您有两个选项来更改__init__.py
适用于Python 3.x
from netscanner.icmpscan import ICMPScan
的from .icmpscan import ICMPScan
,适用于Python2.x/3.x以下是一些参考资料:
发布于 2019-05-22 06:31:21
考虑这一点最简单的方法是,导入应该相对于程序入口点文件进行处理。就我个人而言,我发现这是处理导入路径的最简单和最简单的方法。
在您的示例中,我会:
from netscanner.icmpscan import ICMPScan
在主文件中,而不是将其添加到init.py。
https://stackoverflow.com/questions/56246641
复制相似问题