2016-08-12 104 views
2

我想用PyInstaller 2.0制作一个Python脚本的二进制版本。我正在使用基本的“hello world”tkinter脚本,但导入了一些我需要用于测试Pyinstaller的项目的依赖关系。我在运行Yosemite 10.10.5的Mac上运行。 这是我的脚本:Mac上的PyInstaller无法找到libpython2.7

#!/usr/bin/env python 
from Tkinter import * 
import Tix 
import tkMessageBox 
from sklearn import linear_model, decomposition, preprocessing 
from sklearn.preprocessing import Imputer 
from sklearn.cross_validation import cross_val_score, cross_val_predict 
from sklearn.neighbors import KDTree 
import numpy as np 
import collections 
import array 
import math 
import csv 
from collections import OrderedDict 
import matplotlib 
matplotlib.use("TkAgg") 
import matplotlib.pyplot as plt 
import matplotlib.dates as dates 
from matplotlib.mlab import PCA 
from mpl_toolkits.mplot3d import Axes3D 
from scipy.stats import mode 
import heapq 
import sqlite3 
from sqlite3 import datetime 


root = Tk() 

w = Label(root, text="Hello, world!") 
w.pack() 

root.mainloop() 

这完美运行。然而,当我去建立使用

$pyinstaller -w -F app.py 

然后我得到这个错误的二进制文件:

57665 ERROR: Can not find path ./libpython2.7.dylib (needed by //anaconda/bin/python) 
Traceback (most recent call last): 
    File "//anaconda/bin/pyinstaller", line 11, in <module> 
    sys.exit(run()) 
    File "//anaconda/lib/python2.7/site-packages/PyInstaller/__main__.py", line 90, in run 
    run_build(pyi_config, spec_file, **vars(args)) 
    File "//anaconda/lib/python2.7/site-packages/PyInstaller/__main__.py", line 46, in run_build 
    PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs) 
    File "//anaconda/lib/python2.7/site-packages/PyInstaller/building/build_main.py", line 788, in main 
    build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build')) 
    File "//anaconda/lib/python2.7/site-packages/PyInstaller/building/build_main.py", line 734, in build 
    exec(text, spec_namespace) 
    File "<string>", line 16, in <module> 
    File "//anaconda/lib/python2.7/site-packages/PyInstaller/building/build_main.py", line 212, in __init__ 
    self.__postinit__() 
    File "//anaconda/lib/python2.7/site-packages/PyInstaller/building/datastruct.py", line 178, in __postinit__ 
    self.assemble() 
    File "//anaconda/lib/python2.7/site-packages/PyInstaller/building/build_main.py", line 543, in assemble 
    self._check_python_library(self.binaries) 
    File "//anaconda/lib/python2.7/site-packages/PyInstaller/building/build_main.py", line 626, in _check_python_library 
    raise IOError(msg) 
IOError: Python library not found: libpython2.7.dylib, Python, .Python 
This would mean your Python installation doesn't come with proper library files. 
This usually happens by missing development package, or unsuitable build parameters of Python installation. 

* On Debian/Ubuntu, you would need to install Python development packages 
    * apt-get install python3-dev 
    * apt-get install python-dev 
* If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin) 

没有人有任何想法如何,我可以解决这一问题?当我使用没有额外依赖关系的基本hello world示例时,也会发生此错误。我有//蟒蛇/的libpython2.7.dylib文件lib和我试图连接它usr/lib目录/使用

$sudo ln -s /usr/local/lib/libpython2.7.dylib //anaconda/lib/libpython2.7.dylib 

但是它没有固定的问题...

回答

1

首先,我看到你正在使用conda。我跑进在Mac上完全相同的问题,具体包括:

ERROR: Can not find path ./libpython2.7.dylib 

尝试部署的应用程序我放在一起在畅达环境。

经过大量的谷歌搜索和阅读,我发现目前的PyInstaller不能很好地处理带有@rpath引用的动态库。您可以通过在Python二进制文件上运行“otool -L”来确认库参考是否使用@rpath,对于您来说,它看起来像// anaconda/bin/python(可能是指向//anaconda/bin/python2.7的链接) 。

幸运的是,最近在PyInstaller的一个分支上为conda解决了这个问题。具体的补丁是在https://github.com/conda-forge/pyinstaller-feedstock/pull/2

我做什么使用这个分叉的版本是,我曾在我的畅达环境通过PIP下载,然后用从https://github.com/conda-forge/pyinstaller-feedstock说明使用PyInstaller的这个岔路口我畅达环境卸载PyInstaller。具体而言,这些命令:

conda config --add channels conda-forge 
conda install pyinstaller 

所以我建议切换到PyInstaller专门为畅达环境中,此补丁版本,看看是否它可以帮助你来解决该问题就像为我做的。

相关问题