Is it possible to manually replace or specify the location of a .dylib on Mac OSX when using pyinstaller?
I'm getting the error when trying to open my completed .app
Traceback (most recent call last):
File "DeepMeerkat/main.py", line 3, in <module>
import cv2
File "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 546, in load_module
module = imp.load_module(fullname, fp, filename, ext_tuple)
ImportError: dlopen(/Users/ben/Documents/DeepMeerkat/Installer/dist/Lib/cv2.so, 2): Library not loaded: #loader_path/libpng16.16.dylib
Referenced from: /Users/ben/Documents/DeepMeerkat/Installer/dist/Lib/libopencv_imgcodecs.3.3.dylib
Reason: Incompatible library version: libopencv_imgcodecs.3.3.dylib requires version 48.0.0 or later, but libpng16.16.dylib provides version 45.0.0
Failed to execute script main
I have no problem loading cv2 in python outside of the app, or any other problems with open, which was installed with homebrew.
Poking around, I think it is extremely likely the error comes from pyinstaller grabbing libpng from X11 (/opt/X11/include/libpng16) when it needs to be grabbing from Homebrew's folders (/usr/local/Cellar/libpng/1.6.32/)
How can I use a hook to specify which libpng I want?
I had the same problem, the answer lay in editing the .spec file. Add the following line after a = Analysis...:
a.binaries = a.binaries - TOC([('libpng16.16.dylib',None,None)])
This has the effect of removing the offending dylib from the relevant TOC file which solves the conflict.
Related
We use cx_Freeze to produce standalone binary build of our python application under Mac OS. The build runs well under the build machine (which has Homebrew-and-Python installed), but failed in client machine with following error messages.
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/cx_Freeze/initscripts/__startup__.py", line 14, in run
module.run()
File "/usr/local/lib/python2.7/site-packages/cx_Freeze/initscripts/Console.py", line 26, in run
exec(code, m.__dict__)
File "./utest2.py", line 15, in <module>
from ttLib import *
File "ttLib.py", line 848, in init ttLib
import ctypes
File "/usr/local/Cellar/python#2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 7, in <module>
from _ctypes import Union, Structure, Array
ImportError: dlopen(/Users/gff/src/TextSeek_test/build/test_build/lib/_ctypes.so, 2): Symbol not found: __PySlice_AdjustIndices
Referenced from: /Users/gff/src/TextSeek_test/build/test_build/lib/_ctypes.so
Expected in: flat namespace
in /Users/gff/src/TextSeek_test/build/test_build/lib/_ctypes.so
By browsing stackoverflow answers about "__PySlice_AdjustIndices" and "flat namespace", we suspect this error was caused by the python conflict between system-default version and homebrew version.
Then we use "brew install python#2" in client machine, and the ctypes error disappeared. We run "brew uninstall python#2", this error returned back.
The question is : how can we embed necessary part of homebrew-python to bypass this ctype error?
We used "otool -L lib/_ctypes.so" to know the depenency of dynamic-linked file, it only showed out one file "/usr/lib/libSystem.B.dylib". This file seems to have no relation with python.
Any advice to move forward?
Dev Machine Info: Mac High Sierra, python 2.7.15 64bit. Use homebrew-python to build.
setup.py for cx_Freeze :
build_exe_options = {
"packages": ["wcwidth", "watchdog", "xlrd", "jinja2", "subprocess"],
"excludes": [ "AppKit", "Carbon", "CoreFoundation", "Finder", "Foundation", "FSEvents", "objc"],
"include_msvcr": True,
"zip_include_packages":["winshell", "wcwidth", "watchdog", "pyhk", "xlrd", "jinja2",\
"argh", "ctypes", "email", "encodings" ]
}
exeList = [Executable( "utest2.py", base = None, targetName= "utest") ]
setup( name = "XXX",
description = u"XXX desc",
options = {
"build_exe": build_exe_options,
'bdist_mac': {
'bundle_name': "XXX",
}
},
executables = exeList)
I found the solution by myself.
This issue is caused by wrongly linked dylib files. We use "otool -L" to find the dependency and re-link them with "install_name_tool -change" one by one. Finally the program works.
On the client machine, after installation of the frozen application, try to manually copy all dynamic libraries (.so, .dylib, ...?) which are in the lib subdirectory of the build directory into the build directory itself. Copy also all dynamic libraries which are in the build directory into its lib subdirectory. Does this solve the problem? On the build machine, you should of course use the same python version to produce the frozen application than you use to run the unfrozen application.
If 1. solves the problem, find out which dynamic libraries need to be copied in order that the application works (i.e. find out which of the manual copy actions you've done are really necessary). Use the include_files list of the build_exe options in your setup script to let cx_Freeze include the dynamic library automatically at the build step. You can use a tuple (source, destination) as item in the include_files list to let cx_Freeze copy a file from source to a specific destination into the build directory.
Explanation: I don't know Mac/OS. But I believe the issue you describe could be related to a similar issue with Microsoft Visual C++ Redistributable DLLs under Windows: cx_Freeze 5.1.1 includes packages in a lib subdirectory of the build directory, in the previous versions of cx_Freeze they used to be in the build directory itself. Some dynamic libraries need to be found in the build directory but are erroneously included in the lib subdirectory by cx_Freeze or vice versa. On the build machine it is usually not a problem, because a copy of the library is usually found in the system path, but on the client machine often no copy of the library can be found on the system path, or an incompatible one.
By the way the build_exe option "include_msvcr": True does not seem to work in cx_Freeze5.1.1, see this issue.
I have a Python 2.7/PyQt4 program that I am attempting to freeze with cx_freeze. The program also uses requests, serial, xml.etree.ElementTree, and collections. Using the unmodified setup.py generated by cxfreeze-quickstart-2.7, I can successfully build as both a console program (python setup.py build) and an .app (python setup.py bdist_mac) in Yosemite using Python from macports. If I run the program directly either from the app bundle or the dist:
$ build/MacDISE-1.0.app/Contents/MacOS/macdise
$ dist/macdise
It runs exactly as expected. If I open from the command line:
$ open -a /Users/jeffemandel/macdise/build/MacDISE-1.0.app
I get the dreaded
LSOpenURLsWithRole() failed for the application /Users/jeffemandel/macdise/build/MacDISE-1.0.app with error -10810.
I worked through a number of potential issues raised by Dan McCombs (distutils.util.get_platform, sys.arg), but these don’t seem to be the problem. Through brute force trial and error, I found that if I put all of my code in a separate module, simply importing that module (without actually invoking it) causes the 10810 error, so I figured it was finding a library when run from the command line, but not from the app. I put the dist directory on a thumb drive and ran it on another Mac that doesn't have Python, Qt4, etc installed, and got this:
packages/cx_Freeze/initscripts/Console.py", line 27, in <module> File "macdise.py", line 4, in <module>
File "ExtensionLoader_PyQt4_QtGui.py", line 11, in <module>
ImportError: dlopen(/Volumes/NO NAME/dist/PyQt4.QtGui.so, 2): Library not loaded: /opt/local/Library/Frameworks/QtGui.framework/Versions/4/QtGui
Referenced from: /Volumes/NO NAME/dist/PyQt4.QtGui.so
Reason: image not found
When I look in dist, there is a file QtGui that is the same size as the one in /opt. So it seems the failure is dlopen(PyQt4.QtGui.so) returning a hard-coded path to the QtGui library. I'm guessing the solution is simple, but I haven't stumbled across it yet.
Update: I looked at the libraries in build/Contents/MacOS/PyQt4.*.so with otool, and these all have #executable_path (as opposed to hard-coded paths in dist). My stupid. So I repeated the process of moving the program, only using the MacOS folder rather than the dist folder, and executing macdise from the command line on my wife's MBP. The problem turned out to be in the way I was looking for the included_files. I changed this to:
if getattr(sys, 'frozen', False):
uiName = os.path.join(os.path.dirname(sys.executable), "tabDISE.ui" )
else:
uiName = "tabDISE.ui"
and it runs. What would have saved me a day would be a way to automagically dump the error message generated when executing from the command line to the console log. If someone knows how to do this, it would be a big help.
I am trying to run PyQt4 in Maya 2014 and I keep getting the error that no modules was found etc.
I am a Mac user on OS X 10.7.5 and I have tried running the installation following this link as my guide.
Unfortunately though I am able to install everything as stated, but as I am unable to get the IDLE.app from MacPorts, thus I tried checking whether the PyQt4 is installed either by terminal or through Maya itself where I typed in from PyQt4.QtGui import *
However both methods still state the following error:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named PyQt4.QtGui
Can anyone help me through? Or do I still need to install something else just for Maya-usage?
It would seems that the python package in my machine is Python 2.7.1 as depicted from the terminal
For 2014+ you may want to use PySide, which comes with your Maya and won't need separate installation.
I am trying to get Emacs 24.4 running on Mac (Maverick).
I have tried following these instructions, but when I run:
./build-emacs gzr
I get the error:
bzr: ERROR: exceptions.ImportError: Unable to load subvertpy extensions: dlopen(/Library/Python/2.6/site-packages/subvertpy/client.so, 2): Library not loaded: /usr/lib/libsvn_client-1.0.dylib
Referenced from: /Library/Python/2.6/site-packages/subvertpy/client.so
Reason: image not found
Traceback (most recent call last):
File "/Library/Python/2.6/site-packages/bzrlib/commands.py", line 930, in exception_to_return_code
return the_callable(*args, **kwargs)
File "/Library/Python/2.6/site-packages/bzrlib/commands.py", line 1121, in run_bzr
ret = run(*run_argv)
File "/Library/Python/2.6/site-packages/bzrlib/commands.py", line 673, in run_argv_aliases
return self.run(**all_cmd_args)
File "/Library/Python/2.6/site-packages/bzrlib/commands.py", line 697, in run
return self._operation.run_simple(*args, **kwargs)
File "/Library/Python/2.6/site-packages/bzrlib/cleanup.py", line 136, in run_simple
self.cleanups, self.func, *args, **kwargs)
File "/Library/Python/2.6/site-packages/bzrlib/cleanup.py", line 166, in _do_with_cleanups
result = func(*args, **kwargs)
File "/Library/Python/2.6/site-packages/bzrlib/builtins.py", line 2214, in run
show_bzrdir_info(newdir, verbose=0, outfile=self.outf)
File "/Library/Python/2.6/site-packages/bzrlib/info.py", line 378, in show_bzrdir_info
outfile)
File "/Library/Python/2.6/site-packages/bzrlib/info.py", line 394, in show_component_info
format = describe_format(control, repository, branch, working)
File "/Library/Python/2.6/site-packages/bzrlib/info.py", line 499, in describe_format
format = controldir.format_registry.make_bzrdir(key)
File "/Library/Python/2.6/site-packages/bzrlib/controldir.py", line 1348, in make_bzrdir
return self.get(key)()
File "/Library/Python/2.6/site-packages/bzrlib/registry.py", line 177, in get
return self._dict[self._get_key_or_default(key)].get_obj()
File "/Library/Python/2.6/site-packages/bzrlib/registry.py", line 74, in get_obj
self._obj = get_named_object(self._module_name, self._member_name)
File "/Library/Python/2.6/site-packages/bzrlib/pyutils.py", line 51, in get_named_object
obj = __import__(module_name, {}, {}, from_list)
File "/Library/Python/2.6/site-packages/bzrlib/plugins/svn/workingtree.py", line 28, in <module>
import subvertpy
File "/Library/Python/2.6/site-packages/subvertpy/__init__.py", line 131, in <module>
raise ImportError("Unable to load subvertpy extensions: %s" % e)
ImportError: Unable to load subvertpy extensions: dlopen(/Library/Python/2.6/site- packages/subvertpy/client.so, 2): Library not loaded: /usr/lib/libsvn_client-1.0.dylib
Referenced from: /Library/Python/2.6/site-packages/subvertpy/client.so
Reason: image not found
bzr 2.6.0 on python 2.6.8 (Darwin-13.0.0-x86_64-i386-64bit)
arguments: ['/usr/local/bin/bzr', 'init-repo', 'emacs-bzr']
plugins: bash_completion[2.6.0], bzrtools[2.5.0], changelog_merge[2.6.0],
colo[0.4.0], email[unknown], explorer[1.3.0], fastimport[0.14.0dev],
git[0.6.11], grep[2.6.0], keychain[0.1.0], launchpad[2.6.0], loom[2.2.0],
netrc_credential_store[2.6.0], news_merge[2.6.0], pipeline[1.4.0],
po_merge[2.6.0], qbzr[0.23.1], rewrite[0.6.3], svn[1.2.2], upload[1.1.0],
weave_fmt[2.6.0], xmloutput[0.8.8]
encoding: 'utf-8', fsenc: 'utf-8', lang: 'en_US'
*** Bazaar has encountered an internal error. This probably indicates a
bug in Bazaar. You can help us fix it by filing a bug report at
https://bugs.launchpad.net/bzr/+filebug
including this traceback and a description of the problem.
Any ideas? Another way?
Homebrew provides Emacs 24.4 as well, with
$ brew install emacs --with-cocoa --with-gnutls
I'm using GNU Emacs 24.4.1 (x86_64-apple-darwin13.4.0, NS apple-appkit-1265.21) on OS X 10.9.5 currently, this version is the one from Emacs for Mac OS X and used with It's All Text! for Firefox to write this answer. ;)
Obviously most people generally opt for homebrew (as the top answer indicates), but since homebrew has a tendency to screw with /usr/local to such an extent that it won't cope with alternative (e.g. custom compiled or original) installations of Python, I can't/won't run it (so I compile from source or use MacPorts). For those in a similar position to me regarding homebrew (and I know it's not everyone), then give the Emacs for Mac OS X version a shot, failing that try MacPorts and if it's still not ideal this question has many good responses, depending on your circumstances, particularly this answer.
I've struggled with various emacs installs on OSX, so eventually I switched to MacPorts. It has emacs 24.3 available.
The current "bzr" release doesn't work out of the box on Mavericks. You can either install another prebuilt variant (from MacPorts, homebrew, or fink), or try to manually upgrade the library subvertpy.
I use MacPorts when I use bzr and when I run autogen.sh. However, it must be disabled when you run ./configure --with-ns and make install. (I use two separate terminal windows with different PATH environment variables for this.)
I installed igraph for python in my mac but I can't import it. First I installed C core library, then I proceeded with the instalation for python, by doing:
python setup.py build
python setup.py install
Everything seemed to work fine but I can't import igraph from python shell. Just to clear up, I'm not inside igraph source code's folder. And I got this error:
import igraph
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.macosx-10.3-fat/egg/igraph/__init__.py", line 30, in <module>
File "build/bdist.macosx-10.3-fat/egg/igraph/core.py", line 7, in <module>
File "build/bdist.macosx-10.3-fat/egg/igraph/core.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/*****/.python-eggs/python_igraph-0.5.4-py2.7-macosx-10.3-fat.egg-tmp/igraph/core.so, 2): Symbol not found: _igraph_vector_destroy
Referenced from: /Users/*****/.python-eggs/python_igraph-0.5.4-py2.7-macosx-10.3-fat.egg-tmp/igraph/core.so
Expected in: dynamic lookup
I replaced my folder's name for *, so don't consider it.
I'm running python 2.7 over OS 10.6.7. So there's no pre-compiled version of igraph avaliable (2.5 and 2.6 only). Has this error anything to do with the python version I'm running?
If possible, how can I work this out?
I think the problem is that igraph is installed in /usr/local/lib/libigraph.dylib, but the linker cannot find it when Python tries to load the C core of the igraph module because /usr/local/lib is not on the default library path in Mac OS X. (At least I think so).
First, please check whether libigraph.dylib is really in /usr/local/lib - it should be there. After that, try this:
DYLD_LIBRARY_PATH=/usr/local/lib python -m igraph.test.__init__
This should instruct the linker to look around in /usr/local/lib as well as the default places, and then run Python with the entire igraph test suite.