pyInstaller: error de importación

Estoy en Windows, usando pyInstaller para empaquetar un archivo python. Pero ocurrió un error:

Traceback (most recent call last): File "", line 2, in  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  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  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 

Sé que _socket está en la ruta C:\Python27\libs\_socket.lib , pero ¿cómo puede permitir que el EXE encuentre ese archivo?

Si está usando virtualenv, debe usar la opción “-p” o “–path = ‘D: …'”. Me gusta esto:

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

Lo que esto hace es generar el archivo foo.spec con esta ruta pathex

Esto suena como un trabajo para importaciones ocultas (solo disponible en las últimas comstackciones).

De los docs

 a = Analysis(['myscript.py'], hiddenimports = ['_socket'], ) 

Puede agregar la ruta al archivo de especificaciones de su aplicación.

En el objeto de Análisis , puede especificar pathex=['C:\Python27\libs\', 'C:\Python27\Lib\site-packages'] , y cualquier otra ruta …

Tenga en cuenta que si no se encuentra la ruta, no hay problema … También tengo rutas desde Linux.

Ninguna de las respuestas anteriores funcionó para mí, pero logré que funcionara. Estaba usando openpyxl y requería jdcal en el módulo datetime.py. Ninguna de las importaciones ocultas ni ninguno de esos métodos ayudó, ejecutar el exe aún diría que no se encontró jdcal. La solución alternativa que utilicé fue simplemente copiar las pocas funciones de jdcal directamente en datetime.py en el código de openpyxl. Luego corrió pyinstaller -F program.py

¡Y funcionó!

Tenía problemas similares. Aquí está mi solución para PyQt5, cffi, python 3.4.3:

Esto corrige el error ‘sip’ no encontrado y el error ‘_cffi_backend’ si aparece:

 # -*- 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 ) 

Mire ‘pathex’ y ‘hiddenimports’ arriba. Esos son los únicos cambios generados por defecto. Construye exe con:

pyinstaller LightShowApp.spec -F

Corrí eso fuera de venv o pip-win, ¡para lo que sea que sea esa mierda!