Установка PyGtk в virtualenv

Итак, я пытаюсь запустить простой пример matplotlib в моем virtualenv (в консоли). Здесь код:

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 * backend требует установки pygtk.

И теперь начинается веселье. Я попытался установить 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 и попробовал ./configfure; make; make install. Однако. Я не совсем уверен, как это сделать в virtualenv. Где я могу распаковать источники для pygtk для установки в virtualenv.

Ответ 1

Хитрость заключается в том, чтобы вручную установить правильные пути, а затем запустить configure внутри virtualenv. Это довольно просто, но это сработало для меня.

Установить python-config в виртуальном env и связать его с python2.7-config:

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

Установите cairo в виртуальном env:

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
export PKG_CONFIG_PATH=/home/PATH/TO/VIRT/lib/pkgconfig
./configure --prefix=/home/PATH/TO/VIRT/
make 
make install

И это должно сделать это. Просто замените PATH/TO/VIRT/своим собственным путем. Я уверен, что кто-то может помочь добавить путь к virtualenvwrapper?

Ответ 2

Я сделал это

sudo apt-get install python-gtk2

Я обнаружил, что он уже был установлен при каком-то расследовании, я узнал, что когда я создаю виртуальную среду, у меня пропали некоторые ссылки, поэтому я столкнулся с этим сообщением: Virtualenv на Ubuntu без пакетов сайта.

Я прочитал его и выполнил команды, предоставленные моей настройке, следующим образом:

  • Сначала я перешел в мой virtualenv и активировал его

    source bin/activate
    
  • Затем я перешел в папку lib/python2.7 внутри моего virtualenv:

    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/
    
  • Наконец, чтобы проверить, что я набрал "python" и выполнил:

    >>> import pygtk
    

    Это не дало мне никаких ошибок, и поэтому я знал, что он теперь доступен в моем виртуальном env.

Я использую Ubuntu 14.04 (64-разрядный) на Intel Core i5.

Ответ 3

pygtk не может быть установлен в вашем virtualenv из PyPI, поэтому

pip install pygtk

загрузит, но не установит. Вы можете пройти через обручи загрузки tar файлов и их компиляции и установки, но если в порядке, чтобы сделать ссылки на соответствующие пакеты, установленные в системе, активируйте свой virtualenv и установите 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), а затем ссылки настроены на первый путь (то есть ненулевую длину) для активированного питона.

Ответ 4

Мой опыт (только в системах Posix) заключался в том, что некоторые пакеты не могут быть установлены в virtualenv (я думаю, это потому, что они должны скомпилировать себя и т.д.). Иногда они могут быть установлены в отдельном пакете позже.

Одним из способов справиться с этой ситуацией является компиляция и установка пакета в другом месте, а затем настройка virtualenv для загрузки этого пакета путем добавления путей пакетов сайтов. Подробнее см. . (или настройте boostrap script, который изменяет путь к среде каждый раз, когда вы активируете свою среду (легко сделать с virtualenvwrapper

Ответ 5

У меня та же проблема, но я исправил ее, установив пакет debian python-gtk2