在虚拟环境中安装PyGtk

41

我正在尝试在我的virtualenv中(在控制台中)运行一个简单的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()

然而, 当我运行此程序时,出现以下错误:

导入错误: 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。然而,我不确定如何在 virtualenv 环境下执行这些操作。我应该在哪里解压 pygtk 的源文件以便在 virtualenv 中安装。


如果您在安装时启用了virtualenv,则解压缩的位置不应该有影响。 - Thomas K
好的,当我尝试使用pip安装pygtk时,我收到了之前提到的那个消息。然后我进入了构建文件夹,发现有一个pygtk文件夹。我按照INSTALL文件中的步骤进行操作,一切都正常。但是,当我尝试运行我的代码时,它抱怨说pygtk没有被安装。我不明白,我做错了什么? - George Eracleous
为什么不使用另一个后端? - ptomato
好的,为什么不呢?但是哪一个适合在屏幕上渲染呢?我知道Agg是用于文件的。 - George Eracleous
5个回答

18

诀窍是手动设置正确的路径,然后在虚拟环境中运行configure。这很基础,但对我很有用。

在虚拟环境中安装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中吧?


2
现在你还需要单独构建和安装pygobject,显然。 我自己尚未成功实现这一点。 - Aryeh Leib Taurog
1
我按照(https://gist.github.com/ches/1094799)上的脚本步骤安装了它,但是“import matplotlib.pyplot”仍然认为pygtk未安装。 - ninly
1
我已经成功完成了所有操作,但仍然遇到以下错误:“ImportError:Gtk*后端需要安装pygtk。” - Mala
由于某种原因,似乎无法在pythonpath中安装gtk模块。它会安装到/home/PATH/TO/VIRT/usr/lib/python2.7/site-packages/gtk-2.0/gtk。当然,gtk-2.0不是有效的模块名称--不确定为什么会将其安装在site-packages中。 - Ben Davis
请问您能否详细说明或更新ln -s /home/PATH/TO/VIRT/bin/python-config /home/PATH/TO/VIRT/bin/python2.7-config这个命令?我相信现在大家都使用Python 3了,我猜源文件应该是venv/lib/python3.6/site-packages/setuptools/config.py,但是正确的目标是什么呢? - Michael Scheper

10

我这样做了:

sudo apt-get install python-gtk2

然后我发现它已经被安装了。在进一步的调查中,我发现在创建虚拟环境时缺少一些链接,于是我找到了这篇文章: Virtualenv on Ubuntu with no site-packages

我阅读并按照我的设置修改了提供的命令,如下所示:

  1. 首先,我进入了我的虚拟环境并激活它,方法是

    source bin/activate
    
    然后我进入了虚拟环境中lib/python2.7文件夹:
  2. cd lib/python2.7
    
    我接着执行了下面的命令。
    $ 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/
    
  3. 最后,为了检查我输入了'python'并执行了:

  4. >>> import pygtk
    

    它没有给我任何错误提示,因此我知道它现在可以在我的虚拟环境中使用。

我正在使用一台搭载着Intel Core i5的Ubuntu 14.04 (64位)。


3
这个方法有效,我认为它是一个相关的答案,因为它解决了潜在的问题。我还需要执行ln -s /usr/lib/python2.7/dist-packages/gobject/ln -s /usr/lib/python2.7/dist-packages/gobject/ln -s /usr/lib/python2.7/dist-packages/glib才能使用ase.visualize中的view。虽然这些包可能也可以通过常规方式安装。 - Jonatan Öström

7

不能从PyPI在您的虚拟环境中安装pygtk,因此

pip install pygtk

会下载但不会安装。你可以通过下载tar文件并编译和安装它们的方式来解决,但如果可以链接到系统中已安装的相关软件包,那么激活虚拟环境并安装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的第一个路径(长度不为零)。

我刚刚安装了这个,目前看起来运行良好,现在要进行酸性测试了Anthon,如果它真的有助于我的开发工作,我一定会点赞! - Malcolm Jones
1
这似乎只适用于系统Python,即/usr/bin/python,但在任何其他Python(例如/opt/local/bin/python)上都会失败:( - Good Person

0

我通过安装python-gtk2 Debian软件包解决了这个问题。


0

我的经验(仅限于Posix系统)是有些软件包无法在virtualenv中安装(我认为这是因为它们需要自行编译等)。有时候可以在单独的软件包之后安装它们。

你可以处理这种情况的一种方法是在其他地方编译和安装软件包,然后通过添加site-packages路径来配置virtualenv以加载该软件包。查看文档获取更多信息。(或者设置一个引导脚本,在每次激活环境时更改环境路径(使用virtualenvwrapper很容易实现)


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