2011-04-02 138 views
5

有谁知道我在哪里可以找到这个python模块'contextlib'?Python:没有名为contextlib的模块?

[email protected]:~# 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中?这会工作吗?

+1

你手动编译CPython的? – slezica 2011-04-02 01:40:25

+0

我没有手动编译。我认为有人做了一个包装这一切的自定义工作。 – JavaRocky 2011-04-02 02:22:10

回答

7

正如其他人所指出的,该模块应该是标准的库,但如果它是一个嵌入式设备,它可能已经下降到IMO节省空间(如果是真的,一个愚蠢的选择,因为离开了contextlib.contextmanager抢夺with声明其大部分功能和便利性)

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

至于固定它去,抓住http://hg.python.org/cpython/file/2.6/Lib/contextlib.pysys.path下降某处应该做的伎俩(运行python -m site将转储的目录列表,你可以使用)

0

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

我已经用更多的信息更新了这个问题。谢谢。 – JavaRocky 2011-04-02 02:21:09

4

它根据the docs自2.5以来标准库的一部分。这似乎有点不可思议,你不用它,它与2.6.6对我的作品(Ubuntu的10.10):

[email protected]:~$ 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,所以你应该能够直接使用它,而不需要任何编译或任何东西)。

编辑:除非像圣地亚哥Lezica建议,你编译你的Python的副本手动,在这种情况下,它应该是模块复制到正确的库路径的一个简单的事情。

编辑更新的问题:据我所知,只需将源代码放入Python路径中的目录即可。你可以在系统库中做到这一点,但为了避免它在未来的更新中被删除/替换/以其他方式删除,我建议将它放在一个单独的目录中,并将该目录添加到Python路径中。你可以把它放在/ usr/local下,或者放在你的主目录下。

+0

我已经更新了这个问题。它都运行在基于ARM的cpu上,所以也许这是为了节省空间。我没有自己编译它。 – JavaRocky 2011-04-02 02:20:26

+0

好的,更新了我对答案的更新问题。 – Blair 2011-04-02 02:40:07

-1

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

特别是随着自定义安装,由于文件权限的问题和路径问题导入问题是一些最简单的东西来检查,而且通常解决。

+0

嗨Ned,我检查了/usr/lib/python2.6,它根本没有contextlib.py。我认为它已被排除在发行版之外。 – JavaRocky 2011-04-02 02:21:39

+0

看起来像Ned的类似问题是,如果你天真地调用模块“site.py”。因为site.py被用在导入机器中,所以如果你用这个名字创建一个文件 - 很奇怪/不好的事情发生。 – 2014-05-19 16:43:00

2

随着Angsrom的Linux,contextlib包括在python-misc包。您可以通过运行抓住它:

opkg install python-misc 

这不会,但是,让你所有预期的Python模块,所以您可能还需要安装Python模块:

opkg install python-modules