2013-09-03 1 views
2

Я пытаюсь использовать cxfreeze для создания моих сценариев Python в файле .exe. Однако мои скрипты используют некоторые внешние файлы данных, которые не упаковываются в созданный файл libary.zip.Как я могу включить внешние ресурсы с помощью cxfreeze?

Например, мои скрипты находятся в src/, а внешние данные находятся в src/data/. Я указал свойство include_files в build_exe_options, но это только копии каталог и файлы в встроенный каталог; он не добавляет их в library.zip, где скрипты в конечном итоге ищут файлы.

Даже если я зашел в созданный library.zip и вручную добавлю каталог data, я получаю ту же ошибку. Любая идея, как получить cxfreeze для соответствующего размещения этих внешних ресурсов?

setup.py

from cx_Freeze import setup, Executable 

build_exe_options = {"includes" : ["re"], "include_files" : ["data/table_1.txt", "data/table_2.txt"]} 

setup(name = "My Script", 
     version = "0.8", 
     description = "My Script", 
     options = { "build_exe" : build_exe_options }, 
     executables = [Executable("my_script.py")]) 

fileutil.py (где он пытается прочитать файлы ресурсов)

def read_file(filename): 
    path, fl = os.path.split(os.path.realpath(__file__)) 
    filename = os.path.join(path, filename) 
    with open(filename, "r") as file: 
     lines = [line.strip() for line in file] 
     return [line for line in lines if len(line) == 0 or line[0] != "#"] 

... вызывается с ...

read_file("data/table_1.txt") 

Ошибка Traceback

Traceback (most recent call last): 
    File "C:\Python33\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 2 
7, in <module> exec(code, m.__dict__) 
    File "my_script.py", line 94, in <module> 
    File "my_script.py", line 68, in run 
    File "C:\workspaces\py\test_script\src\tables.py", line 12, in load_data 
    raw_gems = read_file("data/table_1.txt") 
    File "C:\workspaces\py\test_script\src\fileutil.py", line 8, in read_file 
    with open(filename, "r") as file: 
FileNotFoundError: [Errno 2] No such file or directory: 
'C:\\workspaces\\py\\test_script\\src\\build\\exe.win32-3.3\\library.zip\\data/table_1.txt' 

ответ

3

Следующая структура работала для меня:

|-main.py 
|-src 
|-utils.py (containing get_base_dir()) 
|-data 

затем обратитесь к данным всегда относительно расположения main.py, которые вы получаете через следующую функцию в каталоге Src :

import os, sys, inspect 
def get_base_dir(): 
    if getattr(sys,"frozen",False): 
     # If this is running in the context of a frozen (executable) file, 
     # we return the path of the main application executable 
     return os.path.dirname(os.path.abspath(sys.executable)) 
    else: 
     # If we are running in script or debug mode, we need 
     # to inspect the currently executing frame. This enable us to always 
     # derive the directory of main.py no matter from where this function 
     # is being called 
     thisdir = os.path.dirname(inspect.getfile(inspect.currentframe())) 
     return os.path.abspath(os.path.join(thisdir, os.pardir)) 

Если включить данные в соответствии с документацией cx_Freeze, она будет находиться в том же каталоге, что и .exe (т. а не в zip-файле), который будет работать с этим решением.

+0

Вот соответствующий бит документов: http://cx-freeze.readthedocs.org/en/latest/faq.html#using-data-files –

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

  • Нет связанных вопросов^_^