我希望使用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
的应用程序?在
我提出的当前解决方案是使用
glob
包强制feedhidden-imports
变量C:\ProgramData\Anaconda2\envs\wps_env36\Lib\sitepackages\rasterio
中包含的所有模块。在我的spec文件中,我添加了一些python代码来执行此操作:不幸的是,这并不能解释为什么
pyinstaller
一开始就不能看到这些模块。不过,它确实暂时解决了这个问题,代码编译得很好。在相关问题 更多 >
编程相关推荐