代码之家  ›  专栏  ›  技术社区  ›  user32882

我将rasterio绑定到可执行文件的方式有问题吗

  •  2
  • user32882  · 技术社区  · 7 年前

    预期行为和实际行为。

    我希望编译一个脚本使用 rasterio 在可执行文件中使用 pyinstaller . 脚本在python环境中运行良好。然而,我不能冻结成一个可执行文件使用 PyInstaller .

    重现问题的步骤。

    workflow_3.py 包含以下内容:

    import rasterio

    就这样。我尝试编译并使用pyinstaller运行此程序,如下所示:

    (wps_env36) D:\11202750-002_RA2CE\Basis>pyinstaller workflow_3.py (wps_env36) D:\11202750-002_RA2CE\Basis>dist\workflow_3\workflow_3.exe

    编译似乎一直运行到完成,但是当我运行可执行文件时,出现以下错误:

    (wps_env36) D:\11202750-002_RA2CE\Basis>dist\workflow_3\workflow_3.exe
    Traceback (most recent call last):
      File "workflow_3.py", line 1, in <module>
        import rasterio
      File "c:\programdata\anaconda2\envs\wps_env36\lib\site-packages\PyInstaller\loader\pyimod03_i
    mporters.py", line 627, in exec_module
        exec(bytecode, module.__dict__)
      File "site-packages\rasterio\__init__.py", line 23, in <module>
      File "rasterio\_base.pyx", line 1, in init rasterio._base
    ModuleNotFoundError: No module named 'rasterio._shim'
    [17536] Failed to execute script workflow_3
    

    尝试解决问题

    'rasterio._shim' hidden-imports 变量。然后我跑了 pyinstaller workflow_3.spec . 这引起了另一个问题 ModuleNotFoundError control crs.py vrt.py .

    将这些添加到 隐藏的导入 模块找不到错误 但它仍会查找其他包,所有这些包都包含在 C:\ProgramData\Anaconda2\envs\wps_env36\Lib\site-packages\rasterio . 这个目录中大约有40个模块。将此目录中的每个文件名添加到 隐藏的导入 变量。事实上,我甚至不知道它是否有效。

    pathex 变量,以便它可以扩展 PYTHONPATH 用它。但是,这会导致另一个问题:

    File "c:\programdata\anaconda2\envs\wps_env36\lib\traceback.py", line 5, in <module> File "c:\programdata\anaconda2\envs\wps_env36\lib\linecache.py", line 11, in <module> File "c:\programdata\anaconda2\envs\wps_env36\lib\tokenize.py", line 27, in <module> ImportError: cannot import name 'open' pre-safe-import-module hook failed, needs fixing.

    操作系统

    视窗7

    rasterio版本是1.0.8,来自conda forge python版本是3.6.6

    我有两个版本的pyinstaller

    pyinstaller               3.4              py36h7602738_0    conda-forge
    PyInstaller               3.5.dev0+b13e6b30b           <pip>
    

    this problem

    问题

    如何使用 PyInstaller安装程序 ?

    1 回复  |  直到 7 年前
        1
  •  7
  •   user32882    7 年前

    目前我想出的解决办法是强制喂食 hidden-imports 变量中包含的所有模块 C:\ProgramData\Anaconda2\envs\wps_env36\Lib\sitepackages\rasterio 使用 glob

    # -*- mode: python -*-
    
    block_cipher = None
    import glob, os
    rasterio_imports_paths = glob.glob(r'C:\ProgramData\Anaconda2\envs\wps_env36\Lib\site-packages\rasterio\*.py')
    rasterio_imports = ['rasterio._shim']
    
    for item in rasterio_imports_paths:
        current_module_filename = os.path.split(item)[-1]
        current_module_filename = 'rasterio.'+current_module_filename.replace('.py', '')
        rasterio_imports.append(current_module_filename)
    
    a = Analysis(['workflow_3.py'],
                 pathex=['D:\\11202750-002_RA2CE\\Basis'],
                 binaries=[],
                 datas=[],
                 hiddenimports=rasterio_imports,
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher,
                 noarchive=False)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              [],
              exclude_binaries=True,
              name='workflow_3',
              debug=True,
              bootloader_ignore_signals=False,
              strip=False,
              upx=True,
              console=True )
    coll = COLLECT(exe,
                   a.binaries,
                   a.zipfiles,
                   a.datas,
                   strip=False,
                   upx=True,
                   name='workflow_3')
    

    不幸的是,这并不能解释为什么 pyinstaller 一开始就看不到那些模块。不过,它确实可以暂时解决这个问题,而且代码编译得很好。