exe-файл cx_freeze работает в командной строке anaconda, но не в командной строке windows cmd? - PullRequest
0 голосов
/ 15 ноября 2018

Я провел большую часть дня, пытаясь скомпилировать exe-файл из моего скрипта python и запустить его через командную строку vanilla cmd.Мне наконец-то удалось создать exe-файл, но странно, он запускается только в приглашении anaconda, а не в cmd.

Вот полное сообщение об ошибке / 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, которые в данном случае являются зависимостями модуля геопанда.Файл geos_c.dll находится в скомпилированной папке (lib / shapely).

Сценарий прекрасно работает в обычной командной строке, используя

python generateKonsekvens.py

в папке.

Что вызывает это и как я могу это исправить?

Python 3.6.3, Windows 10 64 бит.

ОБНОВЛЕНИЕ

Я попробовал предложенияJPEG, и ни один из них не работал (не удалось найти DLL в этих местах).Я попробовал adhoc-решение для ручного копирования 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"))]}, который находит файл geos_c.dll в каталоге anaconda.Я также упаковал его через Windows CMD на этот раз, и DLL включены.Ошибка, однако, остается той же самой ... Сейчас я попробую с новым, свежим conda anaconda venv, но любые другие идеи пока приветствуются.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Проблема, вероятно, связана с тем, что исполняемый файл ищет Library/lib/geos_c.dll (из-за способа, которым Anaconda упаковывает shapely), но библиотеки DLL упаковываются в cx_Freeze в lib/shapely/geos_c.dll (вероятно, так и будетесли shapely был бы установлен с использованием pip).Когда вы запускаете свой исполняемый файл из командной строки Anaconda, резервный файл находит DLL в пути к библиотеке Anaconda, но если вы запускаете ром из 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"))]}
0 голосов
/ 15 ноября 2018

Я подозреваю, что вы что-то упустили в опциях сборки. Не зная точного пакета, я не могу сказать вам, что включать, но пример вариантов сборки был бы такой (приложение 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)])
...