#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 в каталог моей программы.