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!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据你提供的错误信息,问题出在加载Crypto.Cipher._raw_ecb
这个原生模块时失败,找不到对应的.pyd
文件。这通常是因为PyInstaller在打包时没有正确地收集到所有依赖项,特别是那些C扩展或原生库。
为了解决这个问题,你可以尝试以下步骤:
手动指定隐藏导入:在使用PyInstaller打包时,通过--hidden-import
选项显式地包含未被自动检测到的依赖。对于你的场景,可以尝试添加如下命令行参数:
pyinstaller --hidden-import Crypto.Cipher._raw_ecb 123.py
检查并添加缺失的库路径:如果某些依赖位于非标准位置,确保PyInstaller知道这些路径。可以通过--paths
选项指定额外的搜索路径:
pyinstaller --paths /path/to/your/library 123.py
使用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。
更新PyInstaller和相关库:确保你使用的PyInstaller、Python以及所有依赖库都是最新版本。有时候问题是由旧版本中的已知bug引起的。
清理并重试:有时候,清除之前的构建产物并重新开始可以解决一些奇怪的问题。删除build
和dist
目录,然后重新执行PyInstaller。
如果以上方法都不能解决问题,建议查看pycryptodome
的官方文档或其GitHub页面,看是否有针对PyInstaller的具体指导或已知问题。此外,也可以考虑在PyInstaller的GitHub上搜索类似问题,或者直接在那里提问,因为那里可能会有更多遇到过相同问题的开发者能提供帮助。