Python 3找不到包模块

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (667)

我有一个名为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项目中使用了这个完全相同的方法而没有任何问题。任何帮助将非常感激。

提问于
用户回答回答于

运行时python dns_poison.py,导入器检查模块路径然后检查本地目录,并最终找到netscanner具有以下可用内容的包:

netscanner
netscanner.icmpscan
netscanner.icmpscan.ICMPScan

现在我问你,在哪里icmpscan?进口商找不到,因为它不存在。该PYTHONPATH在哪里存在dns_poison.py居住,并且不附加本身包括任何导入模块的绝对路径,因为那根本就不是它的工作原理。所以netscanner可以找到它,因为它处于同一水平dns_poison.py,但进口商不知道哪里icmpscan.py存在,因为你没有告诉它。所以你有两个选择来改变你的__init__.py

  1. from .icmpscan import ICMPScan 适用于Python 3.x.
  2. from netscanner.icmpscan import ICMPScan 适用于Python 2.x / 3.x.

几个参考资料:

用户回答回答于

考虑这一点最简单的方法是应该相对于程序入口点文件处理导入。我个人认为这是处理导入路径最简单,最简单的方法。

在你的例子中,我会:

from netscanner.icmpscan import ICMPScan

在主文件中,而不是将其添加到init .py。

扫码关注云+社区

领取腾讯云代金券