首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Eventlet - ImportError:没有名为dnskeybase的模块

Eventlet - ImportError:没有名为dnskeybase的模块
EN

Stack Overflow用户
提问于 2019-03-13 23:34:41
回答 1查看 948关注 0票数 2

我不能在我的生产系统上输入事件。它说没有模块名为dnskeybase。

代码语言:javascript
运行
复制
# 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

所以我试着安装它..。

代码语言:javascript
运行
复制
# 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

以及:

代码语言:javascript
运行
复制
# 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)

以及事件版本/安装:

代码语言:javascript
运行
复制
# 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

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2019-04-02 18:26:30

您的本地dnspython包安装中断,或者在不同的位置被一个不完整的dns.rdtypes包所掩盖。它缺少(至少) dns.rdtypes.dnskeybase模块;它只是另一个纯Python模块,没有什么特别之处。

异常消息可能看起来有点混乱,因为它没有命名完整的路径。正在执行以下Python表达式的道义等价物:

代码语言:javascript
运行
复制
module_name = 'dns.rdtypes.dnskeybase'
__import__(module_name, {}, {}, module_name.split('.')[:-1])

它使用函数dnskeybase包动态导入dnskeybase模块。然而,当它丢失时,引发的ImportError: No module named dnskeybase异常不包括dns.rdtypes组件,尽管这是尝试导入的唯一位置。到目前为止,eventlet.support.greendns模块已经导入了dns.rdtypes本身,因此我们知道,对于您的安装来说,这个包至少是存在的,而且是重要的。

包的正常完整安装会添加一个site-packages/dns目录,其中包含以下文件(以及相应的.pyc字节缓存文件):

代码语言:javascript
运行
复制
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源文件生成以下MD5校验和:

代码语言:javascript
运行
复制
$ ( 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中是很简单的。

代码语言:javascript
运行
复制
$ 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校验和,那么您的python模块搜索路径上有一个不同的dns.rdtypes包,它掩盖了正确的版本。

您可以通过添加以下内容找到该包:

代码语言:javascript
运行
复制
import dns.rdtypes
print(dns.rdtypes.__file__)

scraper.py脚本的顶部,在import eventlet行之前。请随时使用import sys; sys.exit()后,以防止完全回溯。打印的文件应该告诉您在哪里查找干扰的流氓包。找到该目录后,重命名该dns目录,或调整您的PYTHONPATH环境变量,使其不包括dns目录所在的目录,或完全删除该目录。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55152733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档