Python:没有名为contextlib的模块?

时间:2011-04-02 01:34:10

标签: python

有谁知道我在哪里可以找到这个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 个答案:

答案 0 :(得分:7)

正如其他人所说,模块应该在标准库中,但是如果它是嵌入式设备,它可能已经被删除以节省空间(如果是真的,这是一个愚蠢的选择IMO,因为离开out contextlib.contextmanager抢夺了with声明的大部分权力和便利

如果您可以为特定设备或制造商命名(或直接询问供应商),您可以获得更好的答案。

就修复它而言,抓住http://hg.python.org/cpython/file/2.6/Lib/contextlib.py并将其放在sys.path某个地方应该可以解决问题(运行python -m site会转储你可以使用的目录列表)

答案 1 :(得分:6)

根据the docs,它自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或您主目录中的某个位置。

答案 2 :(得分:5)

我以不同的方式得到了这个错误。

我在Windows 10上使用32位版本的Python 3.6.5创建了一个pipenv虚拟环境。然后我意识到我需要64位版本。卸载了32位,安装了64位,然后尝试回到我现有的虚拟环境。先前创建的env现在以奇怪的方式被破坏并且给了我这个错误。

我通过删除旧的pipenv pipenv --rm并使用新安装的python版本创建一个新的来解决这个问题。

答案 3 :(得分:2)

使用Angsrom Linux,contextlib包含在python-misc包中。您可以通过运行来获取它:

opkg install python-misc

但是,这不会得到所有预期的python模块,因此您可能还想安装python-modules:

opkg install python-modules

答案 4 :(得分:0)

在Python 2.5中引入了

contextlib,您可以再次删除并重新安装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
>>> 

答案 5 :(得分: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

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

答案 6 :(得分:0)

Python 2
sudo apt-get install python-contextlib2

Python 3
sudo apt-get install python3-contextlib2

答案 7 :(得分:0)

我发现了另外一种情况,它会产生相同的错误。 我用python 3.6制作了一个虚拟环境。将python版本更新至3.7后,我尝试激活旧的虚拟环境并收到此错误。

解决方案是删除旧环境,然后使用新的python版本重新创建它。