开发者社区 问答 正文

python3.10 用pyinstaller打包oss2 运行报错

python3.10 用pyinstaller打包oss2 运行报错,已经困扰我很多天了 实在找不到问题所在

Traceback (most recent call last): File "123.py", line 1, in File " ", line 1027, in _find_and_load File " ", line 1006, in _find_and_load_unlocked File " ", line 688, in load_unlocked File "PyInstaller\loader\pyimod03_importers.py", line 476, in exec_module File "oss2_init.py", line 3, in File " ", line 1027, in _find_and_load File " ", line 1006, in _find_and_load_unlocked File " ", line 688, in _load_unlocked File "PyInstaller\loader\pyimod03_importers.py", line 476, in exec_module File "oss2\models.py", line 9, in File " ", line 1027, in _find_and_load File " ", line 1006, in _find_and_load_unlocked File " ", line 688, in _load_unlocked File "PyInstaller\loader\pyimod03_importers.py", line 476, in exec_module File "oss2\utils.py", line 32, in File " ", line 1027, in _find_and_load File " ", line 1006, in _find_and_load_unlocked File " ", line 688, in load_unlocked File "PyInstaller\loader\pyimod03_importers.py", line 476, in exec_module File "Crypto\Cipher_init.py", line 27, in File " ", line 1027, in _find_and_load File " ", line 1006, in _find_and_load_unlocked File " ", line 688, in _load_unlocked File "PyInstaller\loader\pyimod03_importers.py", line 476, in exec_module File "Crypto\Cipher_mode_ecb.py", line 35, in File "Crypto\Util_raw_api.py", line 309, in load_pycryptodome_raw_lib OSError: Cannot load native module 'Crypto.Cipher._raw_ecb': Not found '_raw_ecb.cp310-win_amd64.pyd', Not found '_raw_ecb.pyd' [944] Failed to execute script '123' due to unhandled exception!

展开
收起
游客45ifjln2gfpnm 2021-11-27 16:21:53 669 分享 版权
阿里云 AI 助理回答

根据你提供的错误信息,问题出在加载Crypto.Cipher._raw_ecb这个原生模块时失败,找不到对应的.pyd文件。这通常是因为PyInstaller在打包时没有正确地收集到所有依赖项,特别是那些C扩展或原生库。

为了解决这个问题,你可以尝试以下步骤:

  1. 手动指定隐藏导入:在使用PyInstaller打包时,通过--hidden-import选项显式地包含未被自动检测到的依赖。对于你的场景,可以尝试添加如下命令行参数:

    pyinstaller --hidden-import Crypto.Cipher._raw_ecb 123.py
    
  2. 检查并添加缺失的库路径:如果某些依赖位于非标准位置,确保PyInstaller知道这些路径。可以通过--paths选项指定额外的搜索路径:

    pyinstaller --paths /path/to/your/library 123.py
    
  3. 使用hook文件:PyInstaller允许用户自定义hook来处理特定库的打包。对于像pycryptodome这样的库,可能已经有现成的hook可用,或者你需要创建一个。首先查找是否有现成的hook(通常在PyInstaller的hooks目录下),如果没有,可以在hooks目录下创建一个名为hook-crypto.py(或具体到hook-Crypto.Cipher._raw_ecb.py)的文件,并在这个文件中指定需要包含的模块和资源。例如:

    from PyInstaller.utils.hooks import collect_submodules, collect_dynamic_libs
    
    hiddenimports = collect_submodules('Crypto.Cipher')
    binaries = collect_dynamic_libs('Crypto')
    

    然后重新运行PyInstaller。

  4. 更新PyInstaller和相关库:确保你使用的PyInstaller、Python以及所有依赖库都是最新版本。有时候问题是由旧版本中的已知bug引起的。

  5. 清理并重试:有时候,清除之前的构建产物并重新开始可以解决一些奇怪的问题。删除builddist目录,然后重新执行PyInstaller。

如果以上方法都不能解决问题,建议查看pycryptodome的官方文档或其GitHub页面,看是否有针对PyInstaller的具体指导或已知问题。此外,也可以考虑在PyInstaller的GitHub上搜索类似问题,或者直接在那里提问,因为那里可能会有更多遇到过相同问题的开发者能提供帮助。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答