我把rasterio绑定到executab中有什么问题吗

2024-05-29 05:26:13 发布

您现在位置:Python中文网/ 问答频道 /正文

预期行为和实际行为

我希望使用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.py、crs.py和{}。在

将这些添加到hidden-imports中成功地消除了ModuleNotFoundError 对于那个特定的包,但是它仍然查找其他包,所有这些包都包含在C:\ProgramData\Anaconda2\envs\wps_env36\Lib\site-packages\rasterio中。这个目录中大约有40个模块。将这个目录中的每个文件名添加到hidden-imports变量似乎有点过分。事实上,我甚至不知道它是否有效。在

因此,我还尝试将整个目录添加到我的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.

操作系统

Windows 7系统

光栅版本和出处

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

我有两个版本的pyinstaller

^{pr2}$

第二个是开发版本,因为this problem

问题

如何使用PyInstaller冻结使用rasterio的应用程序?在


Tags: inpyimport版本lineworkflowfilemodule
1条回答
网友
1楼 · 发布于 2024-05-29 05:26:13

我提出的当前解决方案是使用glob包强制feed hidden-imports变量C:\ProgramData\Anaconda2\envs\wps_env36\Lib\sitepackages\rasterio中包含的所有模块。在我的spec文件中,我添加了一些python代码来执行此操作:

# -*- 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一开始就不能看到这些模块。不过,它确实暂时解决了这个问题,代码编译得很好。在

相关问题 更多 >

    热门问题