我花了大部分时间试图从我的python脚本编译一个exe文件,并通过vanilla cmd命令提示符运行它。我终于设法创建了exe文件,但是很奇怪,它只在anaconda提示符下运行,而不在cmd中运行。
这是完整的错误消息/回溯:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run
module.run()
File "C:\ProgramData\Anaconda3\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run
exec(code, m.__dict__)
File "generateKonsekvens.py", line 1, in <module>
File "C:\ProgramData\Anaconda3\lib\site-packages\geopandas\__init__.py", line 1, in <module>
from geopandas.geoseries import GeoSeries
File "C:\ProgramData\Anaconda3\lib\site-packages\geopandas\geoseries.py", line 7, in <module>
from shapely.geometry import shape, Point
File "C:\ProgramData\Anaconda3\lib\site-packages\shapely\geometry\__init__.py", line 4, in <module>
from .base import CAP_STYLE, JOIN_STYLE
File "C:\ProgramData\Anaconda3\lib\site-packages\shapely\geometry\base.py", line 17, in <module>
from shapely.coords import CoordinateSequence
File "C:\ProgramData\Anaconda3\lib\site-packages\shapely\coords.py", line 8, in <module>
from shapely.geos import lgeos
File "C:\ProgramData\Anaconda3\lib\site-packages\shapely\geos.py", line 130, in <module>
os.path.join(sys.prefix, "Library", "lib", "geos_c.dll"),
File "C:\ProgramData\Anaconda3\lib\site-packages\shapely\geos.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'].
如您所见,它似乎是在anaconda文件夹中寻找东西-这与冻结脚本的目的背道而驰。 geos_c.dll文件属于fiona / shapely,在这种情况下,它们是geopandas模块的依赖项。可以在已编译的文件夹(lib / shapely)中找到geos_c.dll文件。
该脚本在普通命令提示符下使用可以正常运行
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。但是,错误仍然存在...我现在将尝试使用新的新鲜conda anaconda venv,但同时也欢迎其他任何想法。
答案 0 :(得分:0)
我怀疑您的构建选项中缺少某些内容。在不知道确切的软件包的情况下,我无法告诉您要包含的软件包,但是构建选项的一个示例是(用于添加虚拟打印机的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)])
答案 1 :(得分:0)
问题可能是由于可执行文件正在寻找Library/lib/geos_c.dll
(由于Anaconda打包shapely
的方式),但DLL被cx_Freeze
打包到了{{1 }}(可能是如果使用lib/shapely/geos_c.dll
安装了shapely
的情况)。当您从Anaconda提示符运行可执行文件时,回退将在Anaconda库路径中找到DLL,但是如果您从cmd朗姆酒,则此回退将不起作用,因为在cmd路径中找不到DLL的副本。
尝试将DLL手动包含在安装目录中,那么回退可能会起作用。您可以使用安装脚本中的pip
选项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"))]}