预期行为和实际行为。
我希望使用rasterio
编译脚本,并使用pyinstaller
将其制作成可执行文件。该脚本可以在我的Python环境中正常运行。但是,我无法使用PyInstaller
将其冻结为可执行文件。
问题的复现步骤。
我有一个名为workflow_3.py
的脚本,其中包含以下内容:
import rasterio
就这样。我尝试使用以下方式编译并运行它:
(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
。这导致其他模块(例如control
.py,crs.py
和vrt.py
)出现ModuleNotFoundError
。
将它们添加到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版本和来源
rasterio版本为1.0.8,来自conda-forge。Python版本为3.6.6。
我有两个版本的pyinstaller。
pyinstaller 3.4 py36h7602738_0 conda-forge
PyInstaller 3.5.dev0+b13e6b30b <pip>
第二个是开发版本,由于这个问题,我不得不获取它。
问题:
如何使用
PyInstaller
来冻结使用rasterio
的应用程序?