4

我在“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 / 这个线程所建议的那样: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

(我怀疑其中的一个或多个是不必要的,但我一直在摆弄这个太久,并决定停止调查——我的设置现在有效,所以我很满意。)

问题解决了!谢谢大家。

4

5 回答 5

13

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

于 2012-10-28T11:23:01.900 回答
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有一些运气

于 2012-10-11T02:16:02.513 回答
2

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

例如

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

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

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

于 2013-06-23T22:15:55.830 回答
2

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

pip install ruamel.venvgtk

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

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

deps:
    pytest
    ruamel.venvgtk

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

于 2014-12-14T16:34:10.633 回答
2

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

pip install vext
pip install vext.pygtk
于 2017-05-06T06:12:01.650 回答