После компиляции скрипта python в EXE метод архивирования не работает

#python #pyinstaller

Вопрос:

У меня есть скрипт на python, который я скомпилировал в EXE, одна из целей которого-извлечь файл 7z и сохранить его в месте назначения. Если я запускаю его из PyCharm, все отлично работает, вот код:

     def delete_old_version_rename_new(self):
        winutils.delete(self.old_version)
        print("Extracting...")
        Archive(f"{self.new_version}_0.7z").extractall(f"{self.destination}")
        print("Finished")
        os.rename(self.new_version, self.new_name)
 

Я использовал pyinstaller для компиляции программы и использовал команду pyinstaller --onefile --paths {path to site packages} main.py

Спасибо!

Комментарии:

1. Не могу сказать отсюда, но я предполагаю, что вы неправильно указали путь к файлу, если вы явно не задаете полный путь к файлу, например, «текущий рабочий каталог» будет отличаться между pycharm и вашим exe. Начните с печати self.destination

2. я. пункт назначения-r»C:devtree»

Ответ №1:

Исполняемые файлы с одним файлом самостоятельно извлекаются во временную папку и запускаются оттуда, поэтому любые относительные пути будут относиться к этой папке, а не к местоположению исполняемого файла, который вы изначально запустили.

Мое решение-это фрагмент кода, подобный этому:

 if getattr(sys, 'frozen', False):
    app_path = os.path.dirname(sys.executable)
else:
    app_path = os.path.dirname(os.path.abspath(__file__))
 

что дает вам местоположение исполняемого файла в случае с одним файлом исполняемого файла или местоположение сценария в случае запуска из исходного кода.

Смотрите документацию PyInstaller здесь.

Комментарии:

1. Если я вас правильно понимаю, если я буду использовать —onedir вместо —onefile, это должно работать нормально?

2. Это должно работать во всех случаях, я просто более знаком с --onefile подходом, и это то, что вы используете, поэтому я упомянул именно об этом.

3. Хотя я работаю над предположением, что это не работает из-за проблем, связанных с путем. Вы не были полностью ясны в вопросе, что на самом деле происходит не так. Вы определенно должны сообщить больше деталей, чем «не работает».

4. Я действительно не могу сказать, что происходит не так, поскольку pyunpack не дает никакого статуса в процессе извлечения, похоже, что эта строка кода не выполняется, и я не могу сказать, почему. Это началось после компиляции в EXE

Ответ №2:

В конце концов я просто использовал командную строку 7z, которую я взял из https://superuser.com/questions/95902/7-zip-and-unzipping-from-command-line и использовал os.system() для его инициализации. Поскольку моя программа основана на командной строке, она работала еще лучше, поскольку предоставляла статус в процессе извлечения. Единственным недостатком является то, что я должен переместить 7z.exe в каталог моей программы.