2013-02-27 14 views
5

Ich bin in Windows, mit pyInstaller, um eine Python-Datei zu packen. Aber etwas Fehler ist aufgetreten:pyInstaller: Importfehler

Traceback (most recent call last): 
    File "<string>", line 2, in <module> 
    File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 386, in i 
mportHook 
    mod = _self_doimport(nm, ctx, fqname) 
    File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in d 
oimport 
    exec co in mod.__dict__ 
    File "D:\Useful Apps\pyinstaller-2.0\server\build\pyi.win32\server\out00-PYZ.p 
yz\SocketServer", line 132, in <module> 
    File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 386, in i 
mportHook 
    mod = _self_doimport(nm, ctx, fqname) 
    File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in d 
oimport 
    exec co in mod.__dict__ 
    File "D:\Useful Apps\pyinstaller-2.0\server\build\pyi.win32\server\out00-PYZ.p 
yz\socket", line 47, in <module> 
    File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 409, in i 
mportHook 
    raise ImportError("No module named %s" % fqname) 
ImportError: No module named _socket 

Ich weiß, dass _socket in Weg ist C:\Python27\libs\_socket.lib, aber wie kann lassen die EXE diese Datei finden?

Antwort

2

Sie können den Pfad zu Ihrer Anwendungsspezifikationsdatei hinzufügen.

Im Analysis Objekt können Sie pathex=['C:\Python27\libs\', 'C:\Python27\Lib\site-packages'], und anderen Pfad angeben ...

Beachten Sie, dass, wenn der Pfad dort nicht gefunden wird, ist kein Problem ... Ich habe Wege von Linux als auch dort.

2

Das klingt nach einem Job für hidden imports (nur in den neuesten Versionen verfügbar).

Aus der Dokumentation

a = Analysis(['myscript.py'], 
      hiddenimports = ['_socket'], 
      <and everything else>) 
1

Wenn Sie verwenden virtualenv Sie die "-p" oder verwenden sollten "--path = 'D: ...'" -Option. Wie folgt aus:

pyinstaller.exe --onefile --paths=D:\env\Lib\site-packages .\foo.py 

Was das bedeutet ist, erzeugt foo.spec Datei mit diesem pathex Pfad

0

Keine der oben genannten Antworten für mich gearbeitet, aber ich habe es zu arbeiten. Ich benutzte openpyxl und es benötigt jdcal im datetime.py Modul. Keiner der versteckten Importe oder irgendeiner dieser Methoden half, das Ausführen der EXE würde immer noch sagen, dass jdcal nicht gefunden wurde. Der Work-around, den ich verwendet habe, bestand darin, die wenigen Funktionen von jdcal direkt in datetime.py im openpyx-Code zu kopieren. Dann lief pyinstaller -F program.py

und es hat funktioniert!

0

Hatte ähnliche Probleme. Hier ist meine Lösung für PyQt5, cffi, Python 3.4.3:

Dies behebt das 'sip' Fehler nicht gefunden und die '_cffi_backend' ein, wenn das kommt:

# -*- mode: python -*- 

block_cipher = None 


a = Analysis(['LightShowApp.py'], 
      pathex=['c:\\MyProjects\\light-show-editor-36', 
      'c:\\Python34\\libs\\', 'c:\\Python34\\Lib\\site-packages'], 
      binaries=None, 
      datas=None, 
      hiddenimports=['sip', 'cffi'], 
      hookspath=[], 
      runtime_hooks=[], 
      excludes=[], 
      win_no_prefer_redirects=False, 
      win_private_assemblies=False, 
      cipher=block_cipher) 
pyz = PYZ(a.pure, a.zipped_data, 
      cipher=block_cipher) 
exe = EXE(pyz, 
      a.scripts, 
      a.binaries, 
      a.zipfiles, 
      a.datas, 
      name='LightShowApp', 
      debug=False, 
      strip=False, 
      upx=True, 
      console=True) 

Blick auf 'pathex' und 'hiddenimports' oben. Dies sind die einzigen Änderungen, die vom Standard generiert werden. Bauen exe mit:

pyinstaller LightShowApp.spec -F

Ich lief, dass außerhalb von Venv oder Pip-win - whateverTF Mist für ist!