pyInstaller:导入错误

时间:2013-02-27 14:34:54

标签: python windows sockets exe pyinstaller

我在Windows中,使用pyInstaller打包python文件。但是发生了一些错误:

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

我知道_socket位于路径C:\Python27\libs\_socket.lib中,但如何让EXE找到该文件?

9 个答案:

答案 0 :(得分:2)

您可以添加应用程序规范文件的路径。

Analysis对象中,您可以指定pathex=['C:\Python27\libs\', 'C:\Python27\Lib\site-packages']以及任何其他路径......

请注意,如果找不到路径,则没有问题......我也有来自linux的路径。

答案 1 :(得分:2)

这听起来像是hidden imports的工作(仅在最新版本中可用)。

来自文档

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

答案 2 :(得分:2)

如果您使用的是virtualenv,则应使用“-p”或“--path ='D:...'”选项。像这样:

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

这样做是使用此pathex路径生成foo.spec文件

答案 3 :(得分:1)

就我而言,我必须删除目录中与pyinstaller相关的所有文件夹和文件,即__pycache__builddist和{{1} }。我重新运行该版本,该exe正常工作。

答案 4 :(得分:1)

只需删除 '__pycache__' 目录,然后再次运行您的 exe 文件。对我有用

答案 5 :(得分:0)

上述答案都不适合我,但我确实让它发挥作用。我使用的是openpyxl,它在datetime.py模块中需要jdcal。没有任何隐藏的导入或任何这些方法有帮助,运行exe仍然会说jdcal没有找到。我使用的解决方法是将jdcal中的少数函数直接复制到openpyxl代码中的datetime.py中。然后跑了 pyinstaller -F program.py

它有效!

答案 6 :(得分:0)

有类似的问题。这是我对PyQt5,cffi,python 3.4.3的修复:

这会修复'sip'未找到错误,如果出现'_cffi_backend'错误:

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

看看上面的'pathex'和'hiddenimports'。这些是默认生成的唯一更改。用以下代码构建exe:

pyinstaller LightShowApp.spec -F

我在venv之外跑或者赢得了胜利 - 无论那个垃圾是为了什么!

答案 7 :(得分:0)

执行程序不知道库的位置,“ C:\ Python27 \ Lib \ site-packages”等。因此,pyinstaller在创建可执行文件时绑定模块位置。因此,您需要将已使用的所有模块导入程序中。

在主文件中导入“ _socket”模块,然后使用pyinstaller重新编译。

我可能会工作。

注意:,但是系统中安装的模块和程序中使用的模块的版本必须兼容。

答案 8 :(得分:0)

如果您使用的是虚拟环境,则问题出在环境上。

解决方案 只需激活环境并运行 pyinstaller 命令。例如,如果您使用的是 pipenv 环境,则按以下顺序运行命令。

pipenv shell # To activate environment

pyintaller --onefile youscript.py # Command to generate executable