【问题标题】:cx_freeze exe file works in anaconda prompt but not in windows cmd command prompt?cx_freeze exe文件在anaconda提示符下工作,但在windows cmd命令提示符下不工作?
【发布时间】:2018-11-15 16:18:45
【问题描述】:

我大部分时间都在尝试从我的 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 模块的依赖项。 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也包含在内。但是,错误仍然存​​在......我现在将尝试使用新的 conda anaconda venv,但同时欢迎任何其他想法。

【问题讨论】:

  • 根据您发布的错误消息,它应该是lib,而不是binos.path.join(sys.prefix, "Library", "lib", "geos_c.dll") 不是os.path.join(sys.prefix, "Library", "bin", "geos_c.dll"))还是我误解了什么?
  • 正是 - 我就是这么想的。但是 dll 文件实际上位于 bin-文件夹中,而不是在我的 anaconda 目录中的 lib-文件夹中。在lib-文件夹中有一个名为geos_c.lib的文件,可能是相关的?
  • 有趣。看起来 Anaconda 打包依赖项的方式并不简单......如果这是您的选择,您也可以不使用 Anaconda 进行新的 Python 安装并使用 pip 安装 shapely,我的期望是 @ 987654338@ 将在这个新安装中正常工作。或者也许有一种方法可以告诉geos 使用环境变量(例如 TCL)在哪里找到 DLL,但我不知道。
  • 这似乎是 Anaconda 和 cx_Freeze 之间的问题,影响了几个包,请参阅 Henfri 在 this cx_Freeze issue 末尾的帖子。您也可以尝试this 使用与您的配置相对应的轮子。
  • 这个问题有进展吗?我也在使用 anaconda 环境。让 geopandas 中的所有包一起正常工作似乎相当困难,打包它们更困难。

标签: python anaconda cx-freeze geopandas geos


【解决方案1】:

问题可能是由于可执行文件正在寻找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"))]}

【讨论】:

  • 我尝试了上述方法,并用结果更新了问题。遗憾的是还没有解决。
  • 我也有同样的问题
【解决方案2】:

我怀疑您的构建选项中缺少某些内容。在不知道确切的软件包的情况下,我无法告诉您要包​​含哪些内容,但构建选项的一个示例是这个(用于添加虚拟打印机的 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)])

【讨论】:

  • 感谢您的回答。那么,在“packages”条目中,我只会包含一些我认为编译器可能缺少的包?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2019-06-28
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
相关资源
最近更新 更多