Установка вашего локального 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
, или удалите его полностью.