我使用的是安装了OS 10.7.2和Apple默认python 2.7.1的mac。我通过源码安装了opencv 2.3.1,并且可以确认import cv在python内部工作。我创建了一个最小的python脚本(另存为"cvTest.py"),它的顶部只有import cv,没有其他内容,然后我使用了py2app (通过终端命令py2applet --make-setup cvTest.py; python setup.py py2app)。当我将生成的独立应用程序移动到另一台未安装opencv的计算机(MacOS10.7.2)上,并尝试运行该应用程序时,它崩溃了,并通过console.app获得以下错误:
11-11-10 1:17:38.591 PM [0x0-0xcb9cb9].org.pythonmac.unspecified.cvTest: Traceback (most recent call last):
11-11-10 1:17:38.591 PM [0x0-0xcb9cb9].org.pythonmac.unspecified.cvTest: File "/Users/ra/Downloads/cvTest.app/Contents/Resources/__boot__.py", line 103, in <module>
11-11-10 1:17:38.591 PM [0x0-0xcb9cb9].org.pythonmac.unspecified.cvTest: _argv_emulation()
11-11-10 1:17:38.591 PM [0x0-0xcb9cb9].org.pythonmac.unspecified.cvTest: File "/Users/ra/Downloads/cvTest.app/Contents/Resources/__boot__.py", line 101, in _argv_emulation
11-11-10 1:17:38.591 PM [0x0-0xcb9cb9].org.pythonmac.unspecified.cvTest: _get_argvemulator().mainloop()
11-11-10 1:17:38.591 PM [0x0-0xcb9cb9].org.pythonmac.unspecified.cvTest: File "/Users/ra/Downloads/cvTest.app/Contents/Resources/__boot__.py", line 40, in mainloop
11-11-10 1:17:38.591 PM [0x0-0xcb9cb9].org.pythonmac.unspecified.cvTest: stoptime = Evt.TickCount() + timeout
11-11-10 1:17:38.591 PM [0x0-0xcb9cb9].org.pythonmac.unspecified.cvTest: AttributeError: 'module' object has no attribute 'TickCount'
11-11-10 1:17:38.661 PM cvTest: cvTest Error
11-11-10 1:17:39.888 PM com.apple.launchd.peruser.502: ([0x0-0xcb9cb9].org.pythonmac.unspecified.cvTest[49524]) Exited with code: 255然后,我创建了一个简单的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就可以工作了?
发布于 2011-11-11 03:30:17
老实说,我不确定。但我正在做一个基于计算机视觉(It wrappers OpenCV)的开源项目(http://www.simplecv.org)。我们遇到的一个问题是跨平台部署,因为我们想要一键安装程序。
我们尝试在windows上使用Innosetup,遇到了很多问题。我受够了,所以我开始写我自己的。这个程序基本上是一个引导程序。你下载我们的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
发布于 2013-10-25 17:25:01
问题是py2app在包中构建了一个完全不同的Python发行版。这个发行版应该是自包含的,所以它需要包含应用程序在运行时可能使用的所有库(包括OpenCV)。不幸的是,dist/helloworld.app/Contents/Resources/lib/python2.7/lib-dynload/ (参见http://pythonhosted.org/py2app/implementation.html)中的py2app似乎缺少所需的cv2.so文件。
下面是可以正常安装的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: 11cv2.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)我不确定如何处理它们,但我有一种感觉,没有它们,什么都不会起作用。我把这篇文章留在这里,希望其他人能用它来找到解决方案。
发布于 2014-09-12 19:32:41
查找依赖项并将其添加到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包中,它需要一个相对链接,这样应用程序才能移动。:-(
https://stackoverflow.com/questions/8084384
复制相似问题