Eventlet - ImportError: нет модуля с именем dnskeybase - PullRequest
1 голос
/ 14 марта 2019

Я не могу импортировать eventlet в моей производственной системе.Он говорит, что нет модуля с именем dnskeybase.

# python scraper.py 
Traceback (most recent call last):
  File "scraper.py", line 7, in <module>
    import eventlet
  File "/usr/lib/python2.7/site-packages/eventlet/__init__.py", line 10, in <module>
    from eventlet import convenience
  File "/usr/lib/python2.7/site-packages/eventlet/convenience.py", line 7, in <module>
    from eventlet.green import socket
  File "/usr/lib/python2.7/site-packages/eventlet/green/socket.py", line 21, in <module>
    from eventlet.support import greendns
  File "/usr/lib/python2.7/site-packages/eventlet/support/greendns.py", line 67, in <module>
    setattr(dns.rdtypes, pkg, import_patched('dns.rdtypes.' + pkg))
  File "/usr/lib/python2.7/site-packages/eventlet/support/greendns.py", line 59, in import_patched
    return patcher.import_patched(module_name, **modules)
  File "/usr/lib/python2.7/site-packages/eventlet/patcher.py", line 120, in import_patched
    *additional_modules + tuple(kw_additional_modules.items()))
  File "/usr/lib/python2.7/site-packages/eventlet/patcher.py", line 94, in inject
    module = __import__(module_name, {}, {}, module_name.split('.')[:-1])
ImportError: No module named dnskeybase

Поэтому я попытался установить его ...

# pip install dnskeybase
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting dnskeybase
  Could not find a version that satisfies the requirement dnskeybase (from versions: )
No matching distribution found for dnskeybase

и:

# pip install dnspython
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Requirement already satisfied: dnspython in /usr/lib/python2.7/site-packages (1.16.0)

и версию Eventlet / /установка:

# pip install eventlet
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting eventlet
  Using cached https://files.pythonhosted.org/packages/86/7e/96e1412f96eeb2f2eca9342dcc4d5bc9305880a448b603b0a8e54439b71c/eventlet-0.24.1-py2.py3-none-any.whl
Requirement already satisfied: monotonic>=1.4 in /usr/lib/python2.7/site-packages (from eventlet) (1.5)
Requirement already satisfied: six>=1.10.0 in /usr/lib/python2.7/site-packages (from eventlet) (1.12.0)
Requirement already satisfied: dnspython>=1.15.0 in /usr/lib/python2.7/site-packages (from eventlet) (1.16.0)
Requirement already satisfied: greenlet>=0.3 in /usr/lib64/python2.7/site-packages (from eventlet) (0.4.15)
Requirement already satisfied: enum34; python_version < "3.4" in /usr/lib/python2.7/site-packages (from eventlet) (1.1.6)
Installing collected packages: eventlet
Successfully installed eventlet-0.24.1

Есть идеи?

1 Ответ

5 голосов
/ 02 апреля 2019

Установка вашего локального dnspython пакета нарушена или маскируется неполным пакетом dns.rdtypes в другом месте.Отсутствует (как минимум) модуль dns.rdtypes.dnskeybase;это просто еще один модуль чистого Python , ничего особенного.

Сообщение об исключении может показаться немного запутанным, потому что в нем не указан полный путь.Выполняется моральный эквивалент следующего выражения Python:

module_name = 'dns.rdtypes.dnskeybase'
__import__(module_name, {}, {}, module_name.split('.')[:-1])

, которое использует функцию __import__ для динамического импорта модуля dnskeybase из пакета dns.rdtypes.Однако в случае отсутствия исключение ImportError: No module named dnskeybase не включает компонент dns.rdtypes, хотя это единственное место, из которого была предпринята попытка импорта.На этом этапе модуль eventlet.support.greendns уже импортировал сам dns.rdtypes, поэтому мы знаем, что для вашей установки этот пакет по крайней мере присутствует и импортируется.

При нормальной полной установке пакета добавляетсяКаталог site-packages/dns со следующими файлами (плюс соответствующие .pyc файлы кэша байтов):

lib/python2.7/site-packages/dns
├── __init__.py
├── _compat.py
├── dnssec.py
├── e164.py
├── edns.py
├── entropy.py
├── exception.py
├── flags.py
├── grange.py
├── hash.py
├── inet.py
├── ipv4.py
├── ipv6.py
├── message.py
├── name.py
├── namedict.py
├── node.py
├── opcode.py
├── py.typed
├── query.py
├── rcode.py
├── rdata.py
├── rdataclass.py
├── rdataset.py
├── rdatatype.py
├── rdtypes
│   ├── ANY
│   │   ├── AFSDB.py
│   │   ├── AVC.py
│   │   ├── CAA.py
│   │   ├── CDNSKEY.py
│   │   ├── CDS.py
│   │   ├── CERT.py
│   │   ├── CNAME.py
│   │   ├── CSYNC.py
│   │   ├── DLV.py
│   │   ├── DNAME.py
│   │   ├── DNSKEY.py
│   │   ├── DS.py
│   │   ├── EUI48.py
│   │   ├── EUI64.py
│   │   ├── GPOS.py
│   │   ├── HINFO.py
│   │   ├── HIP.py
│   │   ├── ISDN.py
│   │   ├── LOC.py
│   │   ├── MX.py
│   │   ├── NS.py
│   │   ├── NSEC.py
│   │   ├── NSEC3.py
│   │   ├── NSEC3PARAM.py
│   │   ├── OPENPGPKEY.py
│   │   ├── PTR.py
│   │   ├── RP.py
│   │   ├── RRSIG.py
│   │   ├── RT.py
│   │   ├── SOA.py
│   │   ├── SPF.py
│   │   ├── SSHFP.py
│   │   ├── TLSA.py
│   │   ├── TXT.py
│   │   ├── URI.py
│   │   ├── X25.py
│   │   └── __init__.py
│   ├── CH
│   │   ├── A.py
│   │   └── __init__.py
│   ├── IN
│   │   ├── A.py
│   │   ├── AAAA.py
│   │   ├── APL.py
│   │   ├── DHCID.py
│   │   ├── IPSECKEY.py
│   │   ├── KX.py
│   │   ├── NAPTR.py
│   │   ├── NSAP.py
│   │   ├── NSAP_PTR.py
│   │   ├── PX.py
│   │   ├── SRV.py
│   │   ├── WKS.py
│   │   └── __init__.py
│   ├── __init__.py
│   ├── dnskeybase.py
│   ├── dsbase.py
│   ├── euibase.py
│   ├── mxbase.py
│   ├── nsbase.py
│   └── txtbase.py
├── renderer.py
├── resolver.py
├── reversename.py
├── rrset.py
├── set.py
├── tokenizer.py
├── tsig.py
├── tsigkeyring.py
├── ttl.py
├── update.py
├── version.py
├── wiredata.py
└── zone.py

Правильно установленная dnspython версия 1.16.0 создает следующую контрольную сумму MD5 для исходных файлов Python вдерево файлов:

$ ( cd /lib/python2.7/site-packages/dns; export LC_ALL=C; find . -name \*.py -exec md5sum {} \; | sort -k 2 | md5sum )
28e20d8474f4f07287c305dbd5dae8b8  -

Если вы запустите ту же команду и получите другой вывод, то ваша локальная установка будет неполной.

Я рекомендую переустановить пакет;это просто сделать с помощью pip install --ignore-installed:

$ pip install --ignore-installed dnspython
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting dnspython
  Using cached https://files.pythonhosted.org/packages/ec/d3/3aa0e7213ef72b8585747aa0e271a9523e713813b9a20177ebe1e939deb0/dnspython-1.16.0-py2.py3-none-any.whl
Installing collected packages: dnspython
Successfully installed dnspython-1.16.0

Если у вас все еще возникают проблемы даже после переустановки, или вы получили ту же контрольную сумму MD5 дерева файлов, то у вас есть другая Пакет dns.rdtypes в пути поиска модуля python, который маскирует правильную версию.

Вы можете найти этот пакет, добавив:

import dns.rdtypes
print(dns.rdtypes.__file__)

в верхней части скрипта scraper.py,до строки import eventlet.Не стесняйтесь использовать import sys; sys.exit() сразу после, чтобы предотвратить полный возврат.Напечатанный файл должен сказать вам, где искать мошеннический пакет, который мешает.Найдя его, переименуйте этот каталог dns или измените переменную среды PYTHONPATH, чтобы она не включала каталог, в котором находится каталог dns, или удалите его полностью.

...