全局安装Python包,但不是在virtualenv(PyGTK)中安装

时间:2012-10-11 00:55:34

标签: python pygtk virtualenv

我在“virtualenv”中遇到了PyGTK的一些奇怪问题。 gtk不会导入我的virtualenv,而它在我的全局python安装中导入。 (上周我没有遇到这个问题,猜测某些软件更新会让人感到不安。)

有解决此问题的好方法吗?

此处显示:全局导入gtk,

tom@zeppelin:~$ python
Python 2.7.1+ (r271:86832, Sep 27 2012, 21:12:17) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gtk
>>> gtk
<module 'gtk' from '/usr/lib/pymodules/python2.7/gtk-2.0/gtk/__init__.pyc'>

然后无法导入gtk,

tom@zeppelin:~$ workon py27
(py27)tom@zeppelin:~$ python
Python 2.7.1+ (r271:86832, Sep 27 2012, 21:12:17) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gtk
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named gtk

不幸的是,这破坏了我的ipython --pylab环境:http://pastebin.com/mM0ur7Hc

更新: 我能够通过添加grepic / this thread建议的符号链接来解决这个问题:Python: virtualenv - gtk-2.0

略有不同,即我的“cairo”套餐位于/usr/lib/pymodules/python2.7/cairo/而不是/usr/lib/python2.7/dist-packages/cairo

第二次更新: 我还发现将以下行添加到venv/bin/activate

非常有用
export PYTHONPATH=$PYTHONPATH:/home/tom/.virtualenvs/py27/lib/python2.7/dist-packages
export PYTHONPATH=$PYTHONPATH:/home/tom/.virtualenvs/py27/lib/python2.7/dist-packages/gtk-2.0
export PYTHONPATH=$PYTHONPATH:/usr/lib/pymodules/python2.7/gtk-2.0

(我怀疑其中一个或多个是不必要的,但我已经花了很长时间来解决这个问题并决定停止调查 - 我的设置现在有效,所以我很满意。)

问题解决了!谢谢大家。

5 个答案:

答案 0 :(得分:12)

尝试使用--system-site-packages标志创建虚拟环境。

答案 1 :(得分:4)

因此,gtk通常位于/usr/lib/python2.7/dist-packages这样的地方,这个地方位于您的全局环境中的Python路径中,但不在您的虚拟环境中。

您可能希望手动添加gtk的路径,例如

import sys
sys.path.append("/usr/lib/python2.7/dist-packages/gtk")

您还可以在激活虚拟环境时更改路径。打开venv / bin / activate。这是一个可怕的文件,但最后你可以把:

export PATH=$PATH:/my/custom/path

保存并在下次激活虚拟环境时使用:

source venv/bin/activate

您的自定义路径将位于路径中。您可以使用

进行验证
echo $PATH

另一种建议Python: virtualenv - gtk-2.0的方法是进入你的virtualenv目录并添加一个'dist-packages'目录并创建你之前使用的gtk包的符号链接:

mkdir -p venv/lib/python2.7/dist-packages/
cd venv/lib/python2.7/dist-packages/

对于GTK2:

ln -s /usr/lib/python2.7/dist-packages/glib/ glib
ln -s /usr/lib/python2.7/dist-packages/gobject/ gobject
ln -s /usr/lib/python2.7/dist-packages/gtk-2.0* gtk-2.0
ln -s /usr/lib/python2.7/dist-packages/pygtk.pth pygtk.pth
ln -s /usr/lib/python2.7/dist-packages/cairo cairo

对于GTK3:

ln -s /usr/lib/python2.7/dist-packages/gi gi

完全披露:我觉得这两种解决方案都有点苛刻,如果你说这个问题很紧急就可以了。可能有一种“适当”的方式来扩展虚拟环境,所以如果您最终发现更好的解决方案,请告诉我们。你可能会对http://www.virtualenv.org/en/latest/index.html#creating-your-own-bootstrap-scripts

感到幸运

答案 2 :(得分:2)

另一种方法是在virtualenv的site-packages目录中创建一个.pth文件

例如

(在<virtualenv>/lib/python2.7/site-packages/dist-packages.pth

/usr/lib/python2.7/dist-packages/

这解决了我在apt-get安装的pycairo版本中遇到的问题

答案 3 :(得分:2)

如果你想在virtualenv中包含指向相关系统的python gtk-2.0的链接,你可以使用pip来安装ruamel.venvgtk

pip install ruamel.venvgtk

您没有导入任何内容,安装过程中会设置链接。

如果您使用tox,这尤其方便,在这种情况下,您只需要包含依赖项(对于tox):

deps:
    pytest
    ruamel.venvgtk

并且新设置的python2.7环境将在运行测试之前包含相关链接。

答案 4 :(得分:2)

现在可以使用vext解决此问题。 Vext允许您在virtualenv中安装软件包,以便单独访问您的系统软件包。要访问PyGTK,请执行以下操作:

'\e808'