美文网首页
pyinstaller 出现OSError:Cannot loa

pyinstaller 出现OSError:Cannot loa

作者: pixyon | 来源:发表于2019-11-07 21:33 被阅读0次

    使用阿里云储存对象OSS的SDK工具上传图片到阿里云bucket里面,用Pyinstaller打包后,运行出错,提示:

      File "c:\python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 396, in load_module
        exec(bytecode, module.__dict__)
      File "build\bdist.win-amd64\egg\oss2\__init__.py", line 3, in <module>
      File "c:\python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 396, in load_module
        exec(bytecode, module.__dict__)
      File "build\bdist.win-amd64\egg\oss2\models.py", line 10, in <module>
      File "c:\python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 396, in load_module
        exec(bytecode, module.__dict__)
      File "build\bdist.win-amd64\egg\oss2\utils.py", line 30, in <module>
      File "c:\python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 396, in load_module
        exec(bytecode, module.__dict__)
      File "site-packages\Crypto\Cipher\__init__.py", line 27, in <module>
      File "c:\python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 396, in load_module
        exec(bytecode, module.__dict__)
      File "site-packages\Crypto\Cipher\_mode_ecb.py", line 47, in <module>
      File "site-packages\Crypto\Util\_raw_api.py", line 299, in load_pycryptodome_raw_lib
    OSError: Cannot load native module 'Crypto.Cipher._raw_ecb': Trying '_raw_ecb.pyd': cannot load library 'C:\Users\Administrator\AppData\Local\Temp\_MEI242482\Crypto\Util\..\Cipher\_raw_ecb.pyd': error 0x7e.  Additionally, ctypes.util.find_library() did not manage to locate a library called 'C:\\Users\\Administrator\\AppData\\Local\\Temp\\_MEI242482\\Crypto\\Util\\..\\Cipher\\_raw_ecb.pyd'
    

    找到[https://www.twblogs.net/a/5b7f594a2b717767c6af1a3f/zh-cn] 测试可以,原始的解决在[https://raw.githubusercontent.com/pyinstaller/pyinstaller/develop/PyInstaller/hooks/hook-Crypto.py]

    #-----------------------------------------------------------------------------
    # Copyright (c) 2005-2019, PyInstaller Development Team.
    #
    # Distributed under the terms of the GNU General Public License with exception
    # for distributing bootloader.
    #
    # The full license is in the file COPYING.txt, distributed with this software.
    #-----------------------------------------------------------------------------
    
    """
    Hook for PyCryptodome library: https://pypi.python.org/pypi/pycryptodome
    
    PyCryptodome is an almost drop-in replacement for the now unmaintained
    PyCrypto library. The two are mutually exclusive as they live under
    the same package ("Crypto").
    
    PyCryptodome distributes dynamic libraries and builds them as if they were
    Python C extensions (even though they are not extensions - as they can't be
    imported by Python). It might sound a bit weird, but this decision is rooted
    in PyPy and its partial and slow support for C extensions. However, this also
    invalidates several of the existing methods used by PyInstaller to decide the
    right files to pull in.
    
    Even though this hook is meant to help with PyCryptodome only, it will be
    triggered also when PyCrypto is installed, so it must be tested with both.
    
    Tested with PyCryptodome 3.5.1, PyCrypto 2.6.1, Python 2.7 & 3.6, Fedora & Windows
    """
    
    import os
    import glob
    
    from PyInstaller.compat import EXTENSION_SUFFIXES
    from PyInstaller.utils.hooks import get_module_file_attribute
    
    # Include the modules as binaries in a subfolder named like the package.
    # Cryptodome's loader expects to find them inside the package directory for
    # the main module. We cannot use hiddenimports because that would add the
    # modules outside the package.
    
    binaries = []
    binary_module_names = [
        'Crypto.Math',      # First in the list
        'Crypto.Cipher',
        'Crypto.Util',
        'Crypto.Hash',
        'Crypto.Protocol',
        'Crypto.PublicKey',
    ]
    
    try:
        for module_name in binary_module_names:
            m_dir = os.path.dirname(get_module_file_attribute(module_name))
            for ext in EXTENSION_SUFFIXES:
                module_bin = glob.glob(os.path.join(m_dir, '_*%s' % ext))
                for f in module_bin:
                    binaries.append((f, module_name.replace('.', os.sep)))
    except ImportError:
        # Do nothing for PyCrypto (Crypto.Math does not exist there)
        pass
    

    博主优化后的是:

    import os
    import glob
    
    from PyInstaller.compat import EXTENSION_SUFFIXES
    from PyInstaller.utils.hooks import get_module_file_attribute
    
    binaries = []
    binary_module_names = [
        'Crypto.Math',      # First in the list
        'Crypto.Cipher',
        'Crypto.Util',
        'Crypto.Hash',
        'Crypto.Protocol',
    ]
    
    try:
        for module_name in binary_module_names:
            m_dir = os.path.dirname(get_module_file_attribute(module_name))
            for ext in EXTENSION_SUFFIXES:
                module_bin = glob.glob(os.path.join(m_dir, '_*%s' % ext))
                for f in module_bin:
                    binaries.append((f, module_name.replace('.', os.sep)))
    except ImportError:
        # Do nothing for PyCrypto (Crypto.Math does not exist there)
        pass
    

    保存到 C:\python27\Lib\site-packages\PyInstaller\hooks,文件名是hook-Crypto.py,之后关键的是要重启CMD控制端,如果之前有打包过的,把pyinstaller的build里面的该打包程序的文件夹删除,还有spec的一起删除,重新打包就可以

    相关文章

      网友评论

          本文标题:pyinstaller 出现OSError:Cannot loa

          本文链接:https://www.haomeiwen.com/subject/wtrbbctx.html