簡體   English   中英

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 中運行。

這是完整的錯誤消息/回溯:

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,但同時歡迎任何其他想法。

我懷疑您的構建選項中缺少某些內容。 在不知道確切的包的情況下,我無法告訴您要包​​含的內容,但是構建選項的一個示例是這樣的(用於添加虛擬打印機的 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 (可能就像它會如果使用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"))]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM