Python 在py2app生成的应用程序中包含opencv
我使用的是安装了OS 10.7.2和苹果默认python 2.7.1的mac。我通过源代码安装了opencv 2.3.1,可以确认Python 在py2app生成的应用程序中包含opencv,python,opencv,py2app,Python,Opencv,Py2app,我使用的是安装了OS 10.7.2和苹果默认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的其他计算机(ma
import cv
在python中工作。我创建了一个最小的python脚本(另存为“cvTest.py”),它的顶部只有import cv
,没有其他内容,然后我使用了py2app(通过终端命令py2applet--make setup cvTest.py;python setup.py py2app
)。当我将生成的独立应用程序移动到未安装opencv的其他计算机(mac,OS 10.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
执行此操作会产生以下错误:
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]
回溯(最近一次呼叫最后一次):
文件“/Users/ra/Downloads/cvTest.app/Contents/Resources/__boot___.py”,第137行,在
_运行('cvTest.py')
文件“/Users/ra/Downloads/cvTest.app/Contents/Resources/_-boot__.py”,第134行,正在运行
execfile(路径,globals(),globals())
文件“/Users/ra/Downloads/cvTest.app/Contents/Resources/cvTest.py”,第1行,在
导入cv
文件“cv.pyc”,第1行,在
ImportError:没有名为cv2.cv的模块
2011-11-10 13:18:26.239 cvTest[49578:707]cvTest错误
[程序已完成]
那么,这是怎么回事?为什么会出现错误,有没有办法将opencv与py2app创建的应用程序捆绑在一起,以便
导入cv
工作?老实说,我不确定。但我正在从事一个基于计算机视觉(It包装OpenCV)的开源项目(http://www.simplecv.org). 我们面临的一个问题是跨平台部署,因为我们需要一键式安装程序
我们尝试在windows上使用Innosetup,但遇到了很多问题。我受够了,所以我开始写我自己的。这个程序基本上是一个引导程序。你下载我们的exe,运行它,然后它拉入它需要的文件/库列表并开始安装它们。因此,在我们的例子中,我们可以在没有安装库的机器上安装软件。它做的第一件事是在所有python中,然后是setuptools,然后是opencv,等等
基本上,我作为开源发布的应用程序将尝试替代innosetup,但要跨平台。如果您想看到它现在的样子(大约85%)完成,您可以在以下网址查看:
我计划在完成这个项目后,将它作为一个通用的安装程序,您只需提供一个清单文件即可。
以下是现有舱单:
问题在于py2app在包中构建了一个完全不同的Python发行版。发行版应该是自包含的,因此它需要包括应用程序在运行时可能使用的所有库(包括OpenCV)。不幸的是,py2app似乎错过了dist/helloworld.app/Contents/Resources/lib/python2.7/lib-dynload/(请参阅)中所需的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: 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)
我不知道如何处理它们,但我有一种感觉,没有它们,什么都不会起作用。我把这个放在这里,希望其他人可以使用它来找到解决方案。查找依赖项并将其添加到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捆绑包中,它需要一个相对链接,以便应用程序可以移动:-(可以使用
install\u name\u tool
修复@rpath/Python reference–只要您在应用程序中捆绑的Python版本与OpenCV库引用它的路径中的可用版本完全相同。
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 = [........],
....
)
)