Две версии OpenCV в virtualenv, python

К моему лучшему, я не нашел пошагового руководства о том, как достичь того, чего я хочу.

Я хотел бы иметь две конфигурации для своих проектов: python2 с opencv2.4 и python3 с opencv3.1. Для этого я клонирую opencv и создаю виртуальную среду, следуя инструкциям из здесь (только не raspberry PI и с CUDA, но это просто еще один флаг при настройке).

В1: Как мне эффективно управлять установкой opencv, когда я создаю другую виртуальную среду для python3? Могу ли я как-то ссылаться на различные папки сборки?

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

(предположим, opencv клонирован в /home/libraries/opencv/)

Вопрос 2. В разделе 1 руководства описывается установка различных зависимостей для opencv и python. Это перед созданием virtualenv. Могу ли я по-прежнему устанавливать, например, python-dev и python-dev3 одновременно, или я должен перезаписывать вещи в virtualenv?


Q3: Мне удалось правильно установить и символически связать обе версии opencv с соответствующими версиями python в каждом из virtualenv. Однако я не совсем понимаю вывод cmake:

После выполнения cmake (в virtualenv, который по умолчанию использует python2.7; opencv git checkout 2.4.13 и opencv_contrib в мастере, поскольку для opencv2.4 их нет), он использует python2.7 в качестве интерпретатора. Однако путь пакетов, похоже, не использует virtualenv, почему это так и почему он все еще работает?:

--   Python:
--     Interpreter:                 /home/josh/.virtualenvs/tfpy2/bin/python2 (ver 2.7.6)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.6)
--     numpy:                       /home/josh/.virtualenvs/tfpy2/local/lib/python2.7/site-packages/numpy/core/include (ver 1.12.0)
--     packages path:               lib/python2.7/site-packages

При попытке использовать virtualenv с python3.4 (git checkout 3.1.0) cmake теперь, похоже, распознает две версии Python, однако, похоже, выбрал неправильную версию 2.7 (но я каким-то образом успешно построил желаемую версию 3.4). Почему он находит python3.4 в virtualenv, а python2.7 нет, а также почему выбирает неправильный python для сборки?:

--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.6)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.6)
--     numpy:                       /usr/local/lib/python2.7/dist-packages/numpy/core/include (ver 1.11.3)
--     packages path:               lib/python2.7/dist-packages
-- 
--   Python 3:
--     Interpreter:                 /home/josh/.virtualenvs/tfpy3/bin/python3.4 (ver 3.4.3)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.4m.so (ver 3.4.3)
--     numpy:                       /home/josh/.virtualenvs/tfpy3/lib/python3.4/site-packages/numpy/core/include (ver 1.12.0)
--     packages path:               lib/python3.4/site-packages
-- 
--   Python (for build):            /usr/bin/python2.7

(Мне известно, что здесь есть какое-то решение, но разве основная идея virtualenv не в том, чтобы автоматически избегать таких проблем? /38500617/wrong-python-packages-path-for-opencv-cmake-installation">здесь, но мной, если в компиляции была распознана/использована неправильная версия python, поэтому нельзя просто создать символическую ссылку на встроенную библиотеку. )


person beginh    schedule 06.03.2017    source источник


Ответы (2)


A1: Вы можете повторно использовать источники OpenCV следующим образом. Во-первых, вы создаете OpenCV 2.4, это похоже на то, на что вы ссылались, но вы делаете git checkout 2.4.13 вместо 3.1.0 как для opencv, так и для opencv_contrib.

После того, как вы собрали и установили (с помощью make install) версию 2.4, вы затем удаляете папку сборки, выполняете git checkout 3.1.0, настраиваете сборку, чтобы она использовала Python 3. Соберите и установите снова. На этом этапе у вас должны быть созданы и установлены две версии OpenCV на вашем компьютере.

A2: virtualenv полностью посвящен модулям Python или привязкам Python для библиотек. Обратите внимание, как учебник использует virtualenv: вы устанавливаете numpy в virtualenv и создаете ссылку на cv2.so, созданную для поддержки версии Python для этой среды.

person ivan_onys    schedule 06.03.2017
comment
Спасибо! Я рад прочитать ваше решение! Тем временем я столкнулся с проблемой, которую я обновил в основном вопросе, чтобы сохранить пост в чистоте. Не могли бы вы взглянуть и обновить свой ответ? - person beginh; 08.03.2017
comment
Кроме того, позвольте мне заверить, что я знаю, что работает под капотом. По сути, все зависимости необходимы в OpenCV только для сборки библиотеки cv2.so. Сделайте установку, скопировав затем файл .so в сайт-пакеты соответственно python2.7 и python3.4, в зависимости от того, над каким виртуальным сервером я работаю. Так что я могу свободно удалить клонированный репозиторий, да? Чего я не понимаю, так это почему numpy был установлен в virtualenv, а не раньше? Что, если бы у меня были установлены numpy и/или OpenCV из virtualenv, будет ли это перезаписано? - person beginh; 08.03.2017

Вы можете использовать Anaconda для разработки Python. Его Miniconda предназначен для устройств IoT, таких как Raspberry Pi.

Anaconda поддерживает виртуальную среду через свой пакет conda-env и конфигурацию. С conda-env вы можете запускать несколько копий и версий Python. Установите OpenCV через conda install, который загрузит пакет Python из его облака Anaconda. репозиторий пакетов после регистрации. Это уменьшит количество проблем с загрузкой, зависимостями пакетов и установкой. Для пакетов, недоступных в Anaconda Cloud, любые pip install поддерживаемые пакеты python могут быть установлены в Anaconda. Есть кривая обучения, но не слишком сложная для понимания.

Надеюсь, это поможет.

Отказ от ответственности: я не работаю с Anaconda, я просто пользуюсь ею.

person thewaywewere    schedule 06.03.2017
comment
большое спасибо! Однако в этом посте я не только ищу быстрое решение, но и понимаю, что происходит под капотом. - person beginh; 08.03.2017