Как узнать текущий путь к файлу после замораживания в исполняемый файл с помощью cx_Freeze? - PullRequest
2 голосов
/ 24 июня 2019

Я делаю игры на Python.Так как я использую Python3, я должен cx_Freeze своих скриптов в исполняемые файлы, чтобы позволить другим людям, у которых нет Python3, запускать игры.Я поместил ресурсы (текстуры, аудио, файлы и т. Д.) В папку, которая была связана с путем к скрипту.Когда я не cx_Freeze сценария, я использовал __file__, чтобы найти сценарий и использовать его, чтобы найти ресурсы и использовать их.Но после замораживания с использованием cx_Freeze этот метод не работает.

Мой вопрос: как найти путь к файлу скрипта после его замораживания с использованием cx_Freeze?

Я пытался__file__, модуль os и любые другие модули, связанные с путями к файлам.

path = str(__file__).split("/")
path.remove("My executable name")
path.remove("MacOS")
path = "/".join(path) + "/Resources/"

Я ожидал вернуть папку «Ресурсы», но __file__ возвращает только мой домашний каталог, так что это вызывает трассировку.

1 Ответ

0 голосов
/ 25 июня 2019

В документации по 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...