2016-10-12 5 views
1

Я пытаюсь создать .exe для моего проекта python. Открытие сгенерированного файла .exe дает мне ошибку, потому что мой включенный модуль wordcloud пытается открыть файл, который обычно находится рядом с его исходным кодом.Включение файла, отличного от python, в модуль, требуемый cx_freeze?

Модуль сам по себе выглядит следующим образом (как найдено в C:/python/Lib/site-packages/wordcloud):

__init__.py 
__pycache__/ 
color_from_image.py 
DroidSansMono.ttf 
query_integral_image.pyd 
stopwords 
wordcloud.py 
wordcloud_cli.py 

модуль внутри сгенерированной cx_freeze ехе выглядит следующим образом (как найдено в C:/.../my-application/builds/0.1/my-app/my-app.exe/wordcloud):

color_from_image.pyc 
query_integral_image.pyc 
wordcloud.pyc 
__init__.pyc 

Если вы не знаете, cx_freeze включает в себя все модули внутри самого .exe, на ген erated .exe - это как исполняемый файл, так и архив.

В этом файле generatec exe/archive я хотел бы добавить файл stopwords, который находится в исходном источнике. Это возможно?

Большая разница между этим вопросом и параметром cx_freeze include_files заключается в том, что файлы не должны попадать в результирующую папку, но в результирующий файл .exe, рядом с зависимостью wordcloud!

Редактировать: Я пытался использовать include_files с .exe как путь, но, как я и ожидал, это не сработает.

error: build\exe.win32-3.3\my-app.exe: Cannot create a file when that file already exists

ответ

0

Это возможно с помощью опции include_zip.

в setup.py:

import sys 
from cx_Freeze import setup, Executable 

# GUI applications require a different base on Windows (the default is for a 
# console application). 
base = None 
if sys.platform == "win32": 
    base = "Win32GUI" 

zip_includes = [ 
    (r'C:\Python33\Lib\site-packages\wordcloud\stopwords', 'wordcloud/stopwords'), 
    (r'C:\Python33\Lib\site-packages\wordcloud\DroidSansMono.ttf', 'wordcloud/DroidSansMono.ttf') 
] 

setup( name = "my-app", 
     version = "0.1", 
     description = "my-app description", 
     options = {"build_exe": {"zip_includes": zip_includes}}, 
     executables = [Executable("entry.py", base=base)]) 

Жаль, что до сих пор не до конца решить эту проблему, так как требуется модуль использует open('.../archived-file.exe/wordcloud/stopwords') для чтения файла, open не поддерживает чтение из архивируются файлы.

+0

Что касается zip-файла, вы можете найти это полезным: https://docs.python.org/3/library/zipfile.html – shuttle87

+0

@ shuttle87 Код, вызывающий 'open', не мой, мне придется заменить зависимость от моего собственного или исправление его во время сборки: / – Azeirah

Смежные вопросы