cx_freeze exe文件在anaconda提示符下工作,但在windows cmd命令提示符下不工作



我花了一天的大部分时间试图从我的python脚本编译一个exe文件,并通过vanilla cmd命令提示符运行它。我终于创建了exe文件,但奇怪的是,它只在anaconda提示符下运行,而没有在cmd中运行。

以下是完整的错误消息/回溯:

Traceback (most recent call last):
File "C:ProgramDataAnaconda3libsite-packagescx_Freezeinitscripts__startup__.py", line 14, in run
module.run()
File "C:ProgramDataAnaconda3libsite-packagescx_FreezeinitscriptsConsole.py", line 26, in run
exec(code, m.__dict__)
File "generateKonsekvens.py", line 1, in <module>
File "C:ProgramDataAnaconda3libsite-packagesgeopandas__init__.py", line 1, in <module>
from geopandas.geoseries import GeoSeries
File "C:ProgramDataAnaconda3libsite-packagesgeopandasgeoseries.py", line 7, in <module>
from shapely.geometry import shape, Point
File "C:ProgramDataAnaconda3libsite-packagesshapelygeometry__init__.py", line 4, in <module>
from .base import CAP_STYLE, JOIN_STYLE
File "C:ProgramDataAnaconda3libsite-packagesshapelygeometrybase.py", line 17, in <module>
from shapely.coords import CoordinateSequence
File "C:ProgramDataAnaconda3libsite-packagesshapelycoords.py", line 8, in <module>
from shapely.geos import lgeos
File "C:ProgramDataAnaconda3libsite-packagesshapelygeos.py", line 130, in <module>
os.path.join(sys.prefix, "Library", "lib", "geos_c.dll"),
File "C:ProgramDataAnaconda3libsite-packagesshapelygeos.py", line 56, in load_dll
libname, fallbacks or []))
OSError: Could not find lib geos_c.dll or load any of its variants ['Library\lib\geos_c.dll'].

正如你所看到的,它似乎在为蟒蛇文件夹中的某个东西而苦恼——这违背了冻结脚本的目的。geos_c.dll文件属于fiona/shapely,在本例中,它们是geopandas模块的依赖项。geos_c.dll文件可以在编译后的文件夹(lib/shapely(中找到。

该脚本在使用的正常命令提示符下运行得很好

python generateKonsekvens.py

在文件夹中。

造成这种情况的原因是什么?我该如何解决?

Python 3.6.3,windows 10 64位。

更新

我尝试了jpeg的建议,但都不起作用(在这些位置找不到dll(。我尝试了一种临时解决方案,手动将dll复制到Library/lib/geos_c.dll,它复制了一些文件,但出现了相同的错误。然后我尝试使用build_exe_options = {'include_files': [(os.path.join(sys.prefix, "Library", "bin", "geos_c.dll"), os.path.join("Library", "bin", "geos_c.dll"))]},它在anaconda目录中找到geos_c.dll文件。这次我还通过windows cmd对其进行了打包,并包含了dll。然而,错误仍然是一样的。。。我现在将尝试一种新的、新鲜的蟒蛇venv,但同时也欢迎任何其他想法。

问题可能是由于可执行文件正在查找Library/lib/geos_c.dll(由于Anaconda打包shapely的方式(,但DLL被cx_Freeze打包到lib/shapely/geos_c.dll中(可能与使用pip安装shapely时一样(。当您从Anaconda提示符运行可执行文件时,回退会在Anaconda库路径中找到DLL,但如果您从cmd运行,则此回退将不起作用,因为在cmd路径中找不到DLL的副本。

尝试手动将DLL包括在安装目录中,然后回退可能会起作用。您可以使用设置脚本中的build_exe选项include_files来完成此操作:

import os
import sys
build_exe_options = {'include_files': [os.path.join(sys.prefix, "Library", "lib", "geos_c.dll")]}
...
setup(...
options = {'build_exe': build_exe_options},
...)

如果这不起作用,请尝试使用

build_exe_options = {'include_files': [(os.path.join(sys.prefix, "Library", "lib", "geos_c.dll"), os.path.join("lib", "geos_c.dll"))]}

如果这也不起作用,请尝试使用

build_exe_options = {'include_files': [(os.path.join(sys.prefix, "Library", "lib", "geos_c.dll"), os.path.join("Library", "lib", "geos_c.dll"))]}

我怀疑您的构建选项中遗漏了一些内容。在不知道确切的包的情况下,我无法告诉你要包括什么,但构建选项的一个例子是这样的(一个用于添加虚拟打印机的win32应用程序,因此是win32的东西(

build_exe_options = {"packages": ["os","numpy","idna",'win32com.gen_py',"win32timezone","win32print"],
"excludes": ["tkinter"],
"includes":[]}
# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
#if sys.platform == "win32":
#    base = "Win32GUI"
setup(  name = "VirtualPrinter",
version = "0.1",
description = "KRF AMS VPrint",
options = {"build_exe": build_exe_options},
executables = [Executable(r"krfprinter.py", base=base)])

相关内容

最新更新