13

我在 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 importHook
    mod = _self_doimport(nm, ctx, fqname)
  File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in doimport
    exec co in mod.__dict__
  File "D:\Useful Apps\pyinstaller-2.0\server\build\pyi.win32\server\out00-PYZ.pyz\SocketServer", line 132, in <module>
  File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 386, in importHook
    mod = _self_doimport(nm, ctx, fqname)
  File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 480, in doimport
    exec co in mod.__dict__
  File "D:\Useful Apps\pyinstaller-2.0\server\build\pyi.win32\server\out00-PYZ.pyz\socket", line 47, in <module>
  File "D:\Useful Apps\pyinstaller-2.0\PyInstaller\loader\iu.py", line 409, in importHook
    raise ImportError("No module named %s" % fqname)
ImportError: No module named _socket

我知道那_socket是在 path C:\Python27\libs\_socket.lib,但是如何让生成的EXE找到那个文件呢?

4

9 回答 9

17

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

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

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

于 2014-03-11T11:12:25.970 回答
3

这听起来像是隐藏导入的工作(仅在最新版本中可用)。

从文档

a = Analysis(['myscript.py'], 
             hiddenimports = ['_socket'], 
             <and everything else>)
于 2013-03-05T18:15:25.600 回答
3

就我而言,我必须删除与pyinstaller我的目录中相关的所有文件夹和文件,即__pycache__builddist*.spec. 我重新运行构建并且 exe 工作。

于 2020-05-27T15:28:02.043 回答
2

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

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

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

于 2013-03-05T15:06:41.937 回答
1

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

于 2021-08-03T14:15:10.177 回答
1

如果您使用的是虚拟环境,那么问题在于环境。

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

pipenv shell # To activate environment

pyintaller --onefile youscript.py # Command to generate executable  
于 2021-01-04T19:52:10.873 回答
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 或 pip-win 之外运行了它——不管那个垃圾是为了什么!

于 2016-04-19T20:32:13.917 回答
0

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

它奏效了!

于 2015-10-21T13:52:46.657 回答
0

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

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

我可能会工作。

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

于 2020-10-30T18:10:03.847 回答