Python3 не может найти модуль пакета - PullRequest
0 голосов
/ 22 мая 2019

У меня есть файл с именем dns_poison.py, который должен вызывать пакет с именем netscanner.Когда я пытаюсь загрузить модуль icmpscan из dns_poison.py, я получаю это сообщение:

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 без проблем.Любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Когда вы запускаете 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

Пара ссылок для вас:

0 голосов
/ 22 мая 2019

Самый простой способ думать об этом - импорт должен обрабатываться относительно файла точки входа в программу.Лично я считаю, что это самый простой и надежный способ обработки путей импорта.

В вашем примере я хотел бы:

from netscanner.icmpscan import ICMPScan

В основном файле, а не добавлять его в INIT .py.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...