Python: 没有名为 contextlib 的模块?

11 投票
8 回答
31932 浏览
提问于 2025-04-16 14:55

有没有人知道我可以在哪里找到这个Python模块'contextlib'?

root@overo:~# python                                                            
Python 2.6.6 (r266:84292, Mar  9 2011, 10:05:36)                                
[GCC 4.3.3] on linux2                                                           
Type "help", "copyright", "credits" or "license" for more information.          
>>> import contextlib                                                           
Traceback (most recent call last):                                              
  File "<stdin>", line 1, in <module>                                           
ImportError: No module named contextlib                                         

我自己并没有编译Python。我只是碰上了这个麻烦。它是在一个基于ARM的CPU上运行,所以可能为了节省空间,有些东西被省略了。

我运行了 find / | grep contextlib,结果什么都没有找到。

我可以从某个地方下载这个模块,然后直接放到/usr/lib/python2.6里吗?这样可以吗?

8 个回答

8

根据文档,从2.5版本开始,它就已经是标准库的一部分了。你没有这个库听起来有点奇怪,因为我在2.6.6版本(Ubuntu 10.10)上是可以用的:

blair@blair-eeepc:~$ python
Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import contextlib
>>> contextlib.__file__
'/usr/lib/python2.6/contextlib.pyc'

也许有人有更好的建议,但如果真的需要的话,文档顶部有个链接可以查看源代码(这段代码是Python写的,所以你应该可以直接使用,不需要编译什么的)。

编辑:除非,正如Santiago Lezica所建议的,你是手动编译了你的Python版本,这种情况下,只需要把这个模块复制到正确的库路径就可以了。

编辑以更新问题:据我所知,只需把源代码放到Python路径下的某个目录就可以了。你可以把它放在系统库里,但为了避免在未来的更新中被删除、替换或搞坏,我建议把它放在一个单独的目录里,并把这个目录添加到Python路径中。你可以把它放在/usr/local下,或者放在你的家目录里的某个地方。

12

我遇到了一个不同的错误。

我在Windows 10上使用32位的Python 3.6.5创建了一个pipenv虚拟环境。后来我意识到我需要64位的版本。于是我卸载了32位的,安装了64位的,然后尝试回到我之前创建的虚拟环境。结果发现之前创建的环境出现了奇怪的问题,并给我报了错。

我通过删除旧的pipenv环境 pipenv --rm,然后用新安装的Python版本创建了一个新的环境,解决了这个问题。

8

正如其他人提到的,这个模块应该在标准库里,但如果是在嵌入式设备上,可能为了节省空间把它删掉了(如果真是这样,我觉得这很傻,因为不包含contextlib.contextmanager会让with语句失去很多强大和方便的功能)

如果你能说出具体的设备或制造商(或者直接问供应商),你可能能得到更好的答案。

至于怎么解决这个问题,可以去下载http://hg.python.org/cpython/file/2.6/Lib/contextlib.py,然后把它放到sys.path的某个地方就行了(运行python -m site可以显示你可以使用的目录列表)

撰写回答