Python:没有名为contextlib的模块?

11

有人知道我可以在哪里找到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中?这样可以吗?


2
你手动编译过CPython吗? - salezica
我没有手动编译。我认为有人定制了这个打包的工作。 - JavaRocky
8个回答

12

我是以一种不同的方式遇到了这个错误。

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

我通过移除旧的pipenvpipenv --rm并使用新安装的python版本创建了一个新的虚拟环境来解决这个问题。


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下或者您的主目录中的某个位置。


我已经更新了问题。它全部运行在基于ARM的CPU上,所以可能被省略以节省空间。我没有自己编译它。 - JavaRocky

8

正如其他人所指出的,该模块应该在标准库中,但是如果它是一个嵌入式设备,为了节省空间可能已经被删除(如果是真的,那么这是一个愚蠢的选择,在我看来,因为省略contextlib.contextmanager会使with语句失去很多功能和便利性)

如果您能够命名具体的设备或制造商(或直接询问供应商),您可能会得到更好的答案。

至于修复它的方法,获取http://hg.python.org/cpython/file/2.6/Lib/contextlib.py并将其放置在sys.path的某个地方应该就可以解决问题了(运行python -m site将会显示您可以使用的目录列表)。


2

在Angstrom Linux中,contextlib被包含在python-misc软件包中。您可以通过运行以下命令来获取它:

opkg install python-misc

然而,这样做并不能获取您所期望的所有Python模块,因此您可能还需要安装python-modules:

opkg install python-modules

1

我发现还有一种情况会产生相同的错误。 我曾经使用Python 3.6创建了一个虚拟环境。在将Python版本更新为3.7后,我尝试激活旧的虚拟环境,结果出现了这个错误。

解决方法是删除旧环境并使用新的Python版本重新创建它。


我也遇到了这个问题,我猜你的答案似乎与我的问题最相关。然而,我不明白为什么会出现这个错误。而且我不想重新创建所有的虚拟环境。你有没有找到是什么原因导致了这个问题,如果有其他方法可以解决这个问题,而不是重新创建虚拟环境呢?由于虚拟环境包含Python安装的副本,我不明白为什么更新全局(系统)Python版本会影响虚拟环境... - wovano

0

检查 sys.path 确保你的 Python 解释器正在查找正确的目录。它应该类似于这样(不一定完全相同):

>>> import sys
>>> sys.path
['', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/local/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/pymodules/python2.6']

编辑:根据问题中的更新信息,这是在受限设备上安装的未知来源,假设为了节省空间而删除了不必要的模块是有道理的。然而,为了记录,我将提到另一种可能更常见的情况,即找不到模块时存在文件权限问题。例如:

$ python -c 'import contextlib; print(contextlib.__file__)'
/usr/lib/python2.6/contextlib.pyc
$ ls -l /usr/lib/python2.6/contextlib.py*
-rw-r--r-- 1 root root 4136 Dec 26 16:42 /usr/lib/python2.6/contextlib.py
-rw-r--r-- 1 root root 4127 Jan  1 21:45 /usr/lib/python2.6/contextlib.pyc
$ sudo chmod go-r /usr/lib/python2.6/contextlib.py*
$ python -c 'import contextlib; print(contextlib.__file__)'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named contextlib

特别是在自定义安装中,由于文件权限问题和路径问题导致的导入问题是一些最容易检查和通常最容易解决的问题。


嗨 Ned,我检查了 /usr/lib/python2.6 ,它根本没有 contextlib.py。我想这可能是发行版中遗漏的。 - JavaRocky
一个类似于Ned的问题是,如果你天真地调用了一个名为"site.py"的模块。因为site.py被用于导入机制,如果你创建了一个这个名字的文件,会发生非常奇怪/糟糕的事情。 - Danny Staple

0

Python 2
sudo apt-get install python-contextlib2

Python 3
sudo apt-get install python3-contextlib2


Python 2
sudo apt-get install python-contextlib2

Python 3
sudo apt-get install python3-contextlib2


-1

contextlib 是在 Python 2.5 中引入的,你能否尝试移除并重新安装 Python 2.6.6?以下是我拥有的 Python 2.6.6 版本:

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
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接