В документации по cx_Freeze, посвященной этому вопросу, есть раздел Использование файлов данных , в котором говорится:
Приложения часто нуждаются в файлах данных помимо кода, таких как значки.Используя сценарий установки , вы можете перечислить файлы данных или каталоги в опции 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.
Есть еще один моментзаметить, что вы используете cx_Freeze версии 5.1.0 или 5.1.1: пакеты будут включены в подкаталог lib
каталога сборки замороженного приложения, тогда как они находятся в главном каталоге незамерзшего приложения или в site-packages
каталог установки Python.Если вы ссылаетесь на файлы данных, расположенные в каталогах пакетов из основного приложения, вам нужно добавить этот дополнительный lib
к относительному пути, используя, например, os.path.join()
(или удалить его в другом направлении).
Однако в вашем случае, я думаю, Resources
- это просто каталог данных, а не пакет с кодом Python.Затем вам нужно только добавить 'Resources'
в список include_files
в скрипте установки.Чтобы получить файл с именем filename
, расположенный в каталоге Resources
, пример кода, модифицированный следующим образом, должен выполнить работу:
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
datadir = os.path.dirname(__file__)
# The following line has been changed to match where you store your data files:
return os.path.join(datadir, 'Resources', filename)