gpt4 book ai didi

python - 我将 rasterio 捆绑到可执行文件中的方式有​​问题

转载 作者:行者123 更新时间:2023-12-03 16:04:23 38 4
gpt4 key购买 nike

预期行为和实际行为。

我希望使用 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.pyvrt.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
pyinstaller               3.4              py36h7602738_0    conda-forge
PyInstaller 3.5.dev0+b13e6b30b <pip>

第二个是开发版,因为 this problem,所以我必须得到它。

问题

如何使用 PyInstaller卡住使用 rasterio 的应用程序?

最佳答案

我想出的当前解决方案是强制馈送 hidden-imports变量 C:\ProgramData\Anaconda2\envs\wps_env36\Lib\sitepackages\rasterio 中包含的所有模块使用 glob包裹。在我的规范文件中,我添加了一些 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首先无法看到这些模块。但是它确实暂时解决了这个问题,并且代码编译得很好。

关于python - 我将 rasterio 捆绑到可执行文件中的方式有​​问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53149750/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com