Как работать с зависимостями Linux/Python?

из-за отсутствия поддержки некоторых библиотек, которые я хочу использовать, я переместил некоторые разработки Python из Windows в Linux. Я провел большую часть дня, возясь с зависимостями.

вопрос

всякий раз, когда я забираю Linux, я обычно сталкиваюсь с какой-то проблемой зависимости, обычно с библиотеками разработки, устанавливаются ли они через apt-get, easy_install или pip. Я могу тратить дни на то, что должно быть простым заданием, тратить больше времени на работу библиотек, чем на написание кода. где я могу узнать о стратегии решения таких проблем, а не бесцельно гуглить для кого-то, кто столкнулся с той же проблемой раньше?


пример

только один пример: я хотел создать некоторые QR-коды. Поэтому я решил использовать github.com/bitly/pyqrencode который основан на pyqrcode.sourceforge.net но предположительно, без зависимостей Java. Есть и другие (pyqrnative, github.com/Arachnid/pyqrencode) но это казалось лучшим выбором для моих нужд.

Итак, я нашел пакет с pypi и подумал, что использование этого облегчит жизнь:

(Я, возможно, сделал жизнь более трудной для себя, используя virtualenv, чтобы держать вещи в чистоте и порядке.)

(myenv3)mat@ubuntu:~/myenv3$ bin/pip install pyqrencode
Downloading/unpacking pyqrencode
  Downloading pyqrencode-0.2.tar.gz
  Running setup.py egg_info for package pyqrencode

Installing collected packages: pyqrencode
  Running setup.py install for pyqrencode
    building 'qrencode' extension
    gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c qrencode.c -o build/temp.linux-i686-2.7/qrencode.o
    gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions build/temp.linux-i686-2.7/qrencode.o -lqrencode -o build/lib.linux-i686-2.7/qrencode.so

Successfully installed pyqrencode
Cleaning up...

(Я думаю, я, наверное sudo apt-get install libqrencode-dev в какой-то момент до этого тоже.)

Итак, я попытался запустить тестовый скрипт:

(myenv3)mat@ubuntu:~/myenv3$ python test_qr.py 
Traceback (most recent call last):
  File "test_qr.py", line 1, in <module>
    from qrencode import Encoder
  File "qrencode.pyx", line 1, in init qrencode (qrencode.c:1520)
ImportError: No module named ImageOps

: (

Ну расследование выявлено, что ImageOps представляется пил...

(myenv3)mat@ubuntu:~/myenv3$ pip install pil
Downloading/unpacking pil
  Downloading PIL-1.1.7.tar.gz (506Kb): 122Kb downloaded
Operation cancelled by user
Storing complete log in /home/mat/.pip/pip.log
(myenv3)mat@ubuntu:~/myenv3$ bin/pip install pil
Downloading/unpacking pil
  Downloading PIL-1.1.7.tar.gz (506Kb): 506Kb downloaded
  Running setup.py egg_info for package pil
    WARNING: '' not a valid package name; please use only.-separated package names in setup.py

Installing collected packages: pil
  Running setup.py install for pil
    WARNING: '' not a valid package name; please use only.-separated package names in setup.py
    building '_imaging' extension
    gcc ...
    building '_imagingmath' extension
    gcc ...
    --------------------------------------------------------------------
    PIL 1.1.7 SETUP SUMMARY
    --------------------------------------------------------------------
    version       1.1.7
    platform      linux2 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24)
                  [GCC 4.5.2]
    --------------------------------------------------------------------
    *** TKINTER support not available
    *** JPEG support not available
    *** ZLIB (PNG/ZIP) support not available
    *** FREETYPE2 support not available
    *** LITTLECMS support not available
    --------------------------------------------------------------------
    To add a missing option, make sure you have the required
    library, and set the corresponding ROOT variable in the
    setup.py script.

    To check the build, run the selftest.py script.
    ...
Successfully installed pil
Cleaning up...

Хм, PIL установлен, но не взял библиотеки, которые я установил с sudo apt-get install libjpeg62 libjpeg62-dev libpng12-dev zlib1g zlib1g-dev раньше. Я не уверен, как сказать Пипу, чтобы скормить места библиотеки setup.py - ... Googling предлагает различные идеи что я пробовал, но ни один из них похоже, это не только помогает, Но и заставляет меня ходить кругами.

Ubuntu 11.04: установка PIL в virtualenv с помощью PIP предлагает использовать подушка пакет вместо этого, так что давайте попробуем это:

(myenv3)mat@ubuntu:~/myenv3$ pip install pillow
Downloading/unpacking pillow
  Downloading Pillow-1.7.5.zip (637Kb): 637Kb downloaded
  Running setup.py egg_info for package pillow

    ...
Installing collected packages: pillow
  Running setup.py install for pillow
    building '_imaging' extension
    gcc ...
    --------------------------------------------------------------------
    SETUP SUMMARY (Pillow 1.7.5 / PIL 1.1.7)
    --------------------------------------------------------------------
    version       1.7.5
    platform      linux2 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24)
                  [GCC 4.5.2]
    --------------------------------------------------------------------
    *** TKINTER support not available
    --- JPEG support available
    --- ZLIB (PNG/ZIP) support available
    --- FREETYPE2 support available
    *** LITTLECMS support not available
    --------------------------------------------------------------------
    To add a missing option, make sure you have the required
    library, and set the corresponding ROOT variable in the
    setup.py script.

    To check the build, run the selftest.py script.
    ...
Successfully installed pillow
Cleaning up...

Ну, кажется, у нас есть поддержка JPEG и PNG на этот раз, yay!

(myenv3)mat@ubuntu:~/myenv3$ python test_qr.py 
Traceback (most recent call last):
  File "test_qr.py", line 1, in <module>
    from qrencode import Encoder
  File "qrencode.pyx", line 1, in init qrencode (qrencode.c:1520)
ImportError: No module named ImageOps

еще нет ImageOps хотя. Теперь я в тупике, изображение отсутствует из подушки, или это другая проблема, которая также была с pil.

2 ответов


Я вижу две проблемы:

  1. отслеживание всех модулей python, необходимых для вашего проекта.

  2. отслеживание всех динамических библиотек, необходимых для модулей python в вашем проекте.

для первой проблемы я нашел, что климатическое оборудование хорошая помощь, хотя она занимает немного времени, чтобы понять.

в вашем случае, я бы начал с создания каталог для моего нового проекта. Затем я бы зашел в этот каталог и загрузилbootstrap.py

wget http://python-distribute.org/bootstrap.py 

Я бы тогда создал buildout.cfg для:

[buildout]
parts = qrproject
        python
eggs = pyqrencode

[qrproject]
recipe = z3c.recipe.scripts
eggs = ${buildout:eggs}
entry-points= qrproject=qrprojectmodule:run
extra-paths = ${buildout:directory}

# This is a simple way of creating an interpreter that will have
# access to all the eggs / modules that this project uses.
[python]
recipe = z3c.recipe.scripts
interpreter = python
eggs = ${buildout:eggs}
extra-paths = ${buildout:directory}

в этой buildout.cfg для я ссылаюсь на модуль qrprojectmodule (in запись-очки под [qrproject]. Это создаст bin / qrproject, который запускает функцию выполнить в модуле qrprojectmodule. Поэтому я также создам файл qrprojectmodule.py

import qrencode

def run():
    print "Entry point for qrproject. Happily imports qrencode module"

теперь пришло время, чтобы запустить bootstrap.py с бинарными языке Python, который вы хотите использовать:

python bootstrap.py

затем запустите сгенерированный bin / buildout

bin/buildout

это создаст два дополнительных двоичных файла в bin/ - bin / qrproject и bin / python. Бывший твой основной двоичный файл проекта. Он будет создан автоматически при каждом запуске системы и будет иметь все модули и яйца, которые вы хотите загрузить. Второй - это просто удобный способ получить приглашение python, где загружаются все ваши модули и яйца, для легкой отладки. Хорошо, что bin / buildout автоматически установит любые яйца python, которые яйца (в вашем случае pyqrencode) указали в качестве зависимостей.

на самом деле, вы, вероятно, получите ошибку компиляции в шаг, где вы бежите bin / buildout. Это связано с тем, что вам нужно решить проблему 2: все динамические библиотеки доступны в вашей системе. В Linux обычно лучше всего получить помощь от вашей упаковочной системы. Я собираюсь предположить, что вы используете производный Debian, такой как Ubuntu здесь.

веб-сайт pyqrencode указывает, что вам нужна библиотека libqrencode для работы pyqrencode. Поэтому я использовал менеджер пакетов для поиска этого:

$ apt-cache search libqrencode
libqrencode-dev - QR Code encoding library -- development
libqrencode3 - QR Code encoding library
qrencode - QR Code encoder into PNG image

в этом случае я требуется пакет-dev, так как он устанавливает связываемые библиотеки и файлы заголовков, необходимые для компиляции python C-modules. Кроме того, система зависимостей в диспетчере пакетов гарантирует, что если я установлю libqrencode-dev, я тоже получу libqrencode3, как это требуется во время выполнения, т. е. после компиляции модуля.

Итак, я устанавливаю пакет:

sudo apt-get install libqrencode-dev

как только это завершит, rerun bin / buildout и модуль pyqrencode будут (надеюсь) компиляция и установка успешно. Теперь попробуйте запустить bin / qrproject

$ bin/qrproject 
Entry point for qrproject. Happily imports qrencode module

успехов! :-)

Итак, вкратце:

  1. используйте buildout для автоматической загрузки и установки всех модулей python/яиц, необходимых для вашего проекта.

  2. используйте диспетчер пакетов вашей системы для установки любых динамических библиотек (C), требуемых используемыми модулями python.

будьте в курсе что во многих случаях уже есть упакованные версии ваших модулей python, доступных в системе пакетов. Например, pil доступен путем установки python-imaging пакет на Ubuntu. В этом случае вам не нужно устанавливать его через buildout, и вам не нужно беспокоиться о доступности библиотек - менеджер пакетов установит все зависимости, необходимые для запуска модуля. Однако выполнение этого с помощью buildout может облегчить распространение вашего проекта и сделать он работает на других системах.


ваша история напоминает мне о моем раннем опыте работы с Linux, и почему я люблю APT.

нет универсального решения вашей общей проблемы; лучшее, что вы можете сделать, это воспользоваться работы или другие. Упаковщики Debian отлично справляются с пометкой зависимостей пакетов, поэтому apt-get вытащит то, что вам нужно. Итак, моя стратегия - просто избегать создания и установки вещей самостоятельно и использовать apt-get везде, где это возможно.

обратите внимание, что Ubuntu основана на Debian и, таким образом, получает выгоду от работы упаковщиков Debian. Я не использовал Fedora, но слышал, что пакеты не так хорошо организованы, как пакеты из Debian.