2 votes

PyInstaller sur mac ne trouve pas libpython2.7

J'essaie de faire une version binaire d'un script Python en utilisant PyInstaller 2.0. J'utilise un script tkinter basique "hello world" mais j'ai importé quelques dépendances dont j'ai besoin pour un projet pour tester Pyinstaller. Je suis sur un mac exécutant Yosemite 10.10.5. Voici mon script :

#!/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()

Cela fonctionne parfaitement. Cependant, lorsque je construis le binaire à l'aide de la fonction

$pyinstaller -w -F app.py 

puis j'obtiens cette erreur :

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)

Quelqu'un a-t-il une idée de la façon dont je peux résoudre ce problème ? Cette erreur se produit également lorsque j'utilise l'exemple de base de hello world sans les dépendances supplémentaires. J'ai le fichier libpython2.7.dylib dans //anaconda/lib et j'ai essayé de le lier à usr/lib/ à l'aide de

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

mais cela ne résout pas le problème...

1voto

djkrause Points 61

Tout d'abord, je vois que vous utilisez Conda. J'ai rencontré exactement le même problème sur Mac, en particulier :

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

J'essaie de déployer une application que j'ai créée dans un environnement Conda.

Après beaucoup de recherches sur Google et de lectures, j'ai découvert que l'actuel PyInstaller ne gère pas très bien les bibliothèques dynamiques avec des références @rpath. Vous pouvez confirmer que la référence de la bibliothèque utilise @rpath en exécutant "otool -L" sur le binaire Python, qui pour vous ressemble à //anaconda/bin/python (peut être un lien vers //anaconda/bin/python2.7).

Heureusement, ce problème a été récemment corrigé sur un fork de PyInstaller pour conda. Le patch spécifique se trouve à l'adresse https://github.com/conda-forge/pyinstaller-feedstock/pull/2

Ce que j'ai fait pour utiliser cette version bifurquée est de désinstaller PyInstaller que j'avais téléchargé dans mon environnement conda via pip, puis d'utiliser les instructions de https://github.com/conda-forge/pyinstaller-feedstock pour utiliser cette version de PyInstaller dans mon environnement Conda. Plus précisément, ces commandes :

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

Je vous recommande donc de passer à cette version corrigée de PyInstaller spécifiquement pour les environnements conda, et de voir si elle vous aide à surmonter le problème comme cela a été le cas pour moi.

1voto

ishandutta2007 Points 3933

Si vous utilisez python via pyenv comme moi, vous devrez peut-être réinstaller en activant shared pour accéder aux librairies xcode, à moins que vous ne l'ayez fait auparavant.

sudo env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 2.7

PS : Je suis sur Darwin mais quand même enable-shared a travaillé que enable-framework

En fait, le message d'erreur ci-dessous indique ce qu'il faut faire

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X