在virtualenv中安装PyGtk

41 投票
5 回答
30510 浏览
提问于 2025-04-17 11:57

我在我的虚拟环境中(在控制台)尝试运行一个简单的matplotlib示例。代码如下:

import matplotlib
matplotlib.use('GTKAgg')
import matplotlib.pyplot as plt
radius = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
area = [3.14159, 12.56636, 28.27431, 50.26544, 78.53975, 113.09724]
plt.plot(radius, area)
plt.show()

但是,当我运行这个代码时,出现了以下错误:

ImportError: Gtk* 后端需要安装 pygtk。

接下来就有意思了。我尝试用 pip 安装 pygtk,但出现了:

********************************************************************
* Building PyGTK using distutils is only supported on windows. *
* To build PyGTK in a supported way, read the INSTALL file.    *
********************************************************************
Complete output from command python setup.py egg_info:
********************************************************************

我查看了 INSTALL 文件,上面说要尝试 ./configure; make; make install。不过,我不太确定如何在虚拟环境中做到这一点。我应该在哪里解压 pygtk 的源代码,以便在虚拟环境中安装?

5 个回答

7

在你的虚拟环境中,无法直接从PyPI安装pygtk,所以

pip install pygtk

会下载但不会安装。你可以尝试下载压缩包文件,然后自己编译和安装,但如果可以链接到系统中已经安装的相关包,那么只需激活你的虚拟环境并安装ruamel.venvgtk就可以了:

pip install ruamel.venvgtk

这是我自己工作的一个宣传,其他的解决方案在重复创建虚拟环境时效果都不好,比如tox所做的那样。

在这些包的setup.py文件中,会发生以下情况:

try:
    import gtk
except ImportError:
    print('--------------')
    import subprocess
    instdir = subprocess.check_output([
        '/usr/bin/python',
        '-c',
        'import os, pygtk; print os.path.dirname(pygtk.__file__)',
    ]).strip()
    for dst_base in sys.path:
        if dst_base.strip():
            break
    for d in [
        'pygtk.pth',
        'pygtk.py',
        'gtk-2.0',
        'gobject',
        'glib',
        'cairo',
        ]:
        src = os.path.join(instdir, d)
        dst = os.path.join(dst_base, d)
        if os.path.exists(src) and not os.path.exists(dst):
            print('linking', d, 'to', dst_base)
            os.symlink(src, dst)

也就是说,系统的Python会询问pygtk安装在哪里(在Linux Mint 17.1上是/usr/lib/python2.7/dist-packages),然后为激活的Python设置指向第一个非零长度路径的链接。

10

我做了以下操作:

用命令安装了 python-gtk2:

经过一些调查,我发现这个软件已经安装好了。不过,当我创建一个虚拟环境时,发现缺少了一些链接,于是我找到了这篇帖子: 在没有 site-packages 的 Ubuntu 上使用 Virtualenv

我阅读了这篇帖子,并根据我的情况调整了里面的命令,步骤如下:

  1. 首先,我进入了我的虚拟环境并激活它,命令是:

    source bin/activate
    
  2. 然后,我进入了虚拟环境中的 lib/python2.7 文件夹:

    cd lib/python2.7
    
  3. 接着,我执行了以下命令:

    $ ln -s /usr/lib/python2.7/dist-packages/cairo/
    $ ln -s /usr/lib/python2.7/dist-packages/pygtk.py
    $ ln -s /usr/lib/python2.7/dist-packages/pygtk.pth
    $ ln -s /usr/lib/python2.7/dist-packages/gtk-2.0/
    
  4. 最后,为了检查,我输入了 'python',并执行了:

    >>> import pygtk
    

    没有出现错误,因此我知道它现在在我的虚拟环境中可用了。

我使用的是 Ubuntu 14.04(64位),在英特尔 Core i5 上。

18

诀窍是手动设置正确的路径,然后在虚拟环境中运行配置。这其实很简单,但对我来说有效。

在虚拟环境中安装 python-config,并将其链接到 python2.7-config:

pip install config
ln -s /home/PATH/TO/VIRT/bin/python-config /home/PATH/TO/VIRT/bin/python2.7-config

在虚拟环境中安装 cairo:

wget http://cairographics.org/releases/py2cairo-1.10.0.tar.bz2
tar -xf py2cairo-1.10.0.tar.bz2
cd py2cairo-1.10.0
./waf configure --prefix=/home/PATH/TO/VIRT/
./waf build
./waf install

安装 PyGTK:

wget http://pypi.python.org/packages/source/P/PyGTK/pygtk-2.24.0.tar.bz2
tar -xf pygtk-2.24.0.tar.bz2
cd pygtk-2.24.0
export PKG_CONFIG_PATH=/home/PATH/TO/VIRT/lib/pkgconfig
./configure --prefix=/home/PATH/TO/VIRT/
make 
make install

这样就可以了。只需将 PATH/TO/VIRT/ 替换为你自己的路径。我相信有人可以帮忙添加路径到 virtualenvwrapper?

撰写回答