Python包已全局安装,但未在虚拟环境中安装(PyGTK)

4

我在“virtualenv”中使用PyGTK时遇到了一些奇怪的问题。gtk不能在我的虚拟环境中导入,而可以在我的全局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 /此线程所建议的: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

我怀疑其中一个或多个步骤是不必要的,但我已经折腾了很长时间,决定停止调查——我的设置现在可以正常工作,所以我很满意。

问题已解决!谢谢大家。


在全局和虚拟环境中,sys.path 的输出是什么? - iMom0
似乎GTK不在venv路径中,这可能是问题所在。 - tomr_stargazer
5个回答

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

我会考虑下次尝试,感谢你的提示。就目前而言,这个特定的virtualenv已经定制了大量额外的软件包,我不想从头开始。 - tomr_stargazer
我遇到了同样的问题,这个解决方案起作用了。我使用了那个标志重新创建了虚拟环境。 - Luis Lezcano Airaldi

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 中,进入你的虚拟环境目录,添加 '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

好的,这似乎是正确的方向。如果我可以问一个愚蠢的问题,如何确保这些新的符号链接在启动时位于我的venv-python路径中? - tomr_stargazer
好的,这非常有帮助!我发现,在Python中,为了使GTK正常工作,我只需要添加以下代码行:import syssys.path.append('/usr/lib/pymodules/python2.7/gtk-2.0/')sys.path.append('/usr/lib/pymodules/python2.7/')`import gtk
gtk
<module 'gtk' from '/usr/lib/pymodules/python2.7/gtk-2.0/gtk/__init__.pyc'>`但是当我像上面建议的那样将这两个路径插入到venv/bin/activate shell文件中时,“echo $ PATH”会给出预期结果,但在Python中,sys.path不包含新位置。
- tomr_stargazer

3
另外一种方法是在你的虚拟环境的site-packages目录中创建一个.pth文件。
例如,
(在/lib/python2.7/site-packages/dist-packages.pth中)
/usr/lib/python2.7/dist-packages/

这解决了我在使用apt-get安装的pycairo版本时遇到的问题。

好的 - 如果我再次遇到这个问题,我一定会尝试这个解决方法 (: - tomr_stargazer

2

如果你想在虚拟环境中包含相关系统的python gtk-2.0链接,你可以使用pip安装ruamel.venvgtk

pip install ruamel.venvgtk

你不需要导入任何东西,这些链接在安装过程中被设置好了。

如果你正在使用 tox,那么这特别方便,因为在这种情况下,你只需要包含依赖项(对于tox):

deps:
    pytest
    ruamel.venvgtk

在运行测试之前,一个新设置的Python 2.7环境将会包含相关链接。


2

现在可以使用vext解决这个问题。Vext允许您在虚拟环境中安装包,并单独访问系统包。要访问PyGTK,请执行以下操作:

pip install vext
pip install vext.pygtk

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