2013-05-19 3 views
1

Так что мой скрипт python зависит от другого модуля, который я создал. Этот модуль читается в текстовом файле. Сценарий, модуль и файл, который он читает, обычно находятся в том же каталоге, когда я запускаю исходный код, и все работает отлично.зависимость модуля cx_freeze

Я скомпилировал cx_freeze, и когда я запустил его, импортированный модуль завершился с ошибкой. Модуль пытается прочитать файл и говорит, что он не может его найти, и все останавливается прямо там.

Текстовый файл включен в библиотеку.zip и папку сборки (возможно, без необходимости, но я полагал, что это не помешает). Я решил распечатать рабочий каталог в модуле, прежде чем читать файл, чтобы посмотреть, что происходит, и похоже, что рабочий каталог не является папкой сборки, а является домашним каталогом моего пользователя.

Конечно, текстовый файл отсутствует в домашнем каталоге моего пользователя. Как я могу это исправить?

Просто, чтобы быть конкретным, вот пример. Все файлы находятся в одном каталоге.

script.py:

import hello 

hello.py

import os 
print(os.getcwd()) 
f = open('hello.txt','r') 
print(f.read()) 
f.close() 

hello.txt

hello! 

setup.py

import sys 
import os 
from cx_Freeze import setup, Executable 

# Dependencies are automatically detected, but it might need fine tuning. 

includes = ['hello.txt'] 
zip_inc = ['hello.txt'] 

build_exe_options = {"packages": ["os"], "include_files": includes, "zip_includes": zip_inc} 

setup( name = "test", 
     version = "0.1", 
     description = "test", 
     options = {"build_exe": build_exe_options}, 
     executables = [Executable("script.py")]) 

я построил с помощью команды:

python setup.py build 

Затем я запустил файл с именем сценария в директории сборки. Я в Mac OS X, если это имеет значение. Выход заключается в следующем:

/Users/pianowow 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/cx_Freeze/initscripts/Console3.py", line 27, in <module> 
    exec(code, m.__dict__) 
    File "script.py", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1558, in _find_and_load 
    return _find_and_load_unlocked(name, import_) 
    File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/importlib/_bootstrap.py", line 1525, in _find_and_load_unlocked 
    loader.load_module(name) 
    File "/Users/pianowow/Desktop/test/hello.py", line 3, in <module> 
    f = open('hello.txt','r') 
FileNotFoundError: [Errno 2] No such file or directory: 'hello.txt' 

ответ

3

У меня есть запрос тянуть, чтобы обновить документы - вот обновляемый раздел об использовании файлов данных:

Приложения часто нуждаются в файлы данных, кроме кода, такие как иконки , С помощью сценария настройки вы можете перечислить файлы данных или каталоги в опции include_files для build_exe. Они будут скопированы в каталог сборки вместе с исполняемым файлом. Затем, чтобы найти их, используйте такой код:

def find_data_file(filename): 
    if getattr(sys, 'frozen', False): 
     # The application is frozen 
     datadir = os.path.dirname(sys.executable) 
    else: 
     # The application is not frozen 
     # Change this bit to match where you store your data files: 
     datadir = os.path.dirname(__file__) 

    return os.path.join(datadir, filename) 

Альтернативы для встраивания данных в коде, например, с помощью системы ресурсов Qt.

[From this file]

+0

Ну что выглядит как хорошее решение для имеющих несколько рабочих каталогов. У вас есть какое-то представление о том, почему это так? –

+0

В общем, программы не должны предполагать, что рабочий каталог всегда будет в одном месте при их запуске. Даже с обычными незамерзающими скриптами Python вы можете легко запустить его с помощью другого рабочего каталога. –

+0

Что делать, если файл находится из внешней библиотеки, с которой я не могу изменить код? В моем случае я хочу построить модуль jsonschema, и я не могу найти способ: 1) захватить файлы .json и привести их в свою сборку и 2) обеспечить, чтобы исполняемый файл их нашел ... Спасибо! – Sebastien

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