Включение opencv в приложение, сгенерированное py2app - PullRequest
0 голосов
/ 10 ноября 2011

Я использую Mac с OS 10.7.2 и установленным по умолчанию Python 2.7.1 от Apple.Я установил opencv 2.3.1 через источник и могу подтвердить, что import cv работает из питона.Я создал минимальный скрипт на python (сохраненный как «cvTest.py»), который просто имеет import cv вверху и ничего больше, затем я использовал py2app (через терминальные команды py2applet --make-setup cvTest.py; python setup.py py2app).Когда я перемещаю получившееся автономное приложение на другой компьютер (Mac, OS 10.7.2), на котором не установлен opencv, и пытаюсь запустить приложение, оно вылетает, и через console.app:

* 1005 появляется следующая ошибка*

Затем я создал простой скрипт bash, который позволяет мне копаться в автономном приложении и запускать бинарный файл приложения из терминала:

#!/bin/bash
CMD=$0
PROGDIR=$(echo $CMD|perl -pe 's|/[^/]*$||')
cd "$PROGDIR"
"./cvTest.app/Contents/MacOS/cvTest"

Выполнение этого приводит к следующим ошибкам:

Traceback (most recent call last):
  File "/Users/ra/Downloads/cvTest.app/Contents/Resources/__boot__.py", line 137, in <module>
    _run('cvTest.py')
  File "/Users/ra/Downloads/cvTest.app/Contents/Resources/__boot__.py", line 134, in _run
    execfile(path, globals(), globals())
  File "/Users/ra/Downloads/cvTest.app/Contents/Resources/cvTest.py", line 1, in <module>
    import cv
  File "cv.pyc", line 1, in <module>
ImportError: No module named cv2.cv
2011-11-10 13:18:26.239 cvTest[49578:707] cvTest Error

[Process completed]

Итак, что здесь происходит?Почему я получаю сообщение об ошибке, и есть ли способ связать opencv с приложением, созданным py2app, чтобы import cv работал?

Ответы [ 3 ]

0 голосов
/ 25 октября 2013

Проблема в том, что py2app встраивает в пакет совершенно другой дистрибутив Python.Предполагается, что дистрибутив является автономным, поэтому он должен включать все библиотеки, которые приложение может использовать во время выполнения (включая OpenCV).К сожалению, py2app, похоже, пропускает необходимый файл cv2.so из dist / helloworld.app / Contents / Resources / lib / python2.7 / lib-dynload / (см. http://pythonhosted.org/py2app/implementation.html).

Вот чтоРабочая установка OpenCV выглядит следующим образом:

bash-3.2$ ls -1 /usr/local/lib/python2.7/site-packages/cv*
/usr/local/lib/python2.7/site-packages/cv.py
/usr/local/lib/python2.7/site-packages/cv.pyc
/usr/local/lib/python2.7/site-packages/cv2.so

Таким образом, теоретически, копирование cv2.so в dist / helloworld.app / Contents / Resources / lib / python2.X / lib-dynload / должно решить проблему.

К сожалению, возникает другая проблема:

bash-3.2$ dist/main_wx.app/Contents/MacOS/main_wx 
Segmentation fault: 11

cv2.so имеет массу зависимостей, которые необходимо включить:

bash-3.2$ otool -L /usr/local/Cellar/opencv/2.4.5/lib/python2.7/site-packages/cv2.so 
/usr/local/Cellar/opencv/2.4.5/lib/python2.7/site-packages/cv2.so:
        /usr/local/lib/python2.7/site-packages/cv2.so (compatibility version 0.0.0, current version 0.0.0)
        /usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.0)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_core.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_flann.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_imgproc.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_video.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_ml.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_highgui.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_features2d.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_calib3d.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_photo.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_objdetect.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_contrib.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_legacy.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_gpu.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_ocl.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/local/Cellar/opencv/2.4.5/lib/libopencv_nonfree.2.4.dylib (compatibility version 2.4.0, current version 2.4.5)
        /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)
        /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)

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

0 голосов
/ 12 сентября 2014

Поиск и добавление зависимостей в пакет py2app можно выполнить следующим образом:

import os, sys, glob

frameworks = []
opencvLibs = glob.glob(os.path.join(sys.exec_prefix, 'lib', 'libopencv*.2.4.dylib'))
frameworks.extend(opencvLibs)

setup(app=['myApp'],
    options=dict(py2app=dict(
       frameworks=frameworks,
       includes = ['cv2',.....],
       packages = [........],
       ....
       )
    )

НО, к сожалению, это не решает проблему полностью.Для меня это выглядит так, как будто cv2.so был скомпилирован со статической ссылкой на @ rpath / Python, но в вашем пакете pyapp ему нужна относительная ссылка, чтобы приложение могло двигаться.: - (

0 голосов
/ 10 ноября 2011

Если честно, я не уверен.Но я работаю над проектом с открытым исходным кодом, основанным на компьютерном зрении (он включает в себя OpenCV) и других (http://www.simplecv.org).). Одна из проблем, с которыми мы сталкиваемся, заключается в развертывании на разных платформах, так как нам нужны установщики в один клик.

Мы попытались использовать Innosetup на Windows и столкнулись с множеством проблем. Я сыт по горло, поэтому я начал писать свою собственную. По сути, эта программа является программой начальной загрузки. Вы загружаете наш exe, запускаете его, затем он вытягивает списокфайлов / библиотек, в которых он нуждается, и начинает их устанавливать. Таким образом, в нашем случае мы можем установить наше программное обеспечение на компьютер, на котором установлены ноль библиотек. Сначала он делает это с помощью python, затем setuptools, затем opencv и т. д.

В основном приложение, которое я выпускаю с открытым исходным кодом, попытается заменить innosetup, но кроссплатформенным. Если вы хотите увидеть его готовым сейчас (около 85%), вы можете проверить его по адресу: https://github.com/ingenuitas/SimpleCV/blob/installer/install/simplecv-installer.py

Я планирую отключить этот проект, когда я закончу, так что это может быть универсальный установщик, который вы просто прОвидите файл манифеста в.Вот существующий манифест: https://github.com/ingenuitas/SimpleCV/blob/installer/install/manifest.json

...