cx_freeze exe 文件在 anaconda 提示符下有效,但在 windows cmd 命令提示符下无效?

cx_freeze exe file works in anaconda prompt but not in windows cmd command prompt?

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

这是完整的错误 message/traceback:

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 模块的依赖项。 geos_c.dll 文件可以在编译后的文件夹 (lib/shapely) 中找到。

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

python generateKonsekvens.py

在文件夹中。

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

Python 3.6.3,windows 10 64 位。

更新

我尝试了 jpeg 的建议,none 成功了(在那些位置找不到 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 文件。我这次也是通过windowscmd打包的,dll都包含进去了。但是,错误仍然存​​在...我现在将尝试使用全新的 conda anaconda venv,但同时欢迎任何其他想法。

我怀疑您在构建选项中遗漏了某些内容。不知道确切的包我不能告诉你要包括什么,但是构建选项的一个例子是这个(一个用于添加虚拟打印机的 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)])

问题可能是由于可执行文件正在寻找 Library/lib/geos_c.dll(由于 Anaconda 打包 shapely 的方式),但 DLL 被 cx_Freeze 打包到 lib/shapely/geos_c.dll(可能就像 shapely 使用 pip 安装时一样)。当您从 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"))]}