У меня есть файл .py, который я превратил в исполняемый файл с помощью pyinstaller. Все работает нормально: я могу прочитать данные в файле excel текущего рабочего каталога, а также могу записать файл .txt; однако, когда я пытаюсь добавить данные одного из фреймов данных сеанса в один из файлов excel (в первой пустой строке), я получаю PermissionError: [Errno 13] Permission denied:
Чтобы создать этот .exe, я создаю виртуальную среду, в которой устанавливаю все зависимости, затем, как только venv активируется в CMD, я запускаю (venv) C:\Users\Usuario\Desktop\test>pyi-makespec --onefile test.py
. Затем я удостоверяюсь, что в файле .spec есть вся необходимая информация, например. возможность чтения файлов CWD и зависимостей библиотек (что приводит к этому, следуя инструкциям на это руководство). После этого я готов запустить (venv) C:\Users\Usuario\Desktop\test>pyinstaller test.spec
, который создает файл .exe (внутри папки dist, которую я перемещаю в основную папку)
.exe работает гладко вплоть до того момента, когда я хочу прочитать существующий файл .xlsx и добавить к нему данные. Я столкнулся с той же проблемой ранее с этой программой, когда пытался сделать df_xxx.to_csv(path)
, чтобы записать некоторые данные в виде файла .txt. Для ясности код, с помощью которого я успешно обошел эту проблему:
cwd = os.getcwd()
rewards_filename = "rewards_" + str(a_tuple_variable).replace(", ", "_") + ".txt"
with open(os.path.join(cwd,rewards_filename), "x") as rewards_outfile:
rewards_outfile.write(str(df_to_export_as_txt).rstrip(r"\r\n")) # I strip newlines
rewards_outfile.close()
Программа работает до тех пор, пока не встретит эту вспомогательную функцию, которую я оставлю как есть, изменив, конечно, только имя файла, передав ей ранее созданная переменная historical_filename = os.path.join(cwd,"historical.xlsx")
. Запуск прямо из Spyder работает нормально, добавляя данные в нужное место, но он прерывается при выполнении файла .exe. Я получаю сообщение об ошибке:
Traceback (most recent call last):
File "test.py", line 219, in <module>
append_df_to_excel(filename = historical_filename, df = df_to_append_to_historical, sheet_name = "Sheet1", startcol = 0, startrow = None)
File "test.py", line 183, in append_df_to_excel
writer = pandas.ExcelWriter(filename, engine = "openpyxl")
File "pandas\io\excel\_openpyxl.py", line 30, in __init__
File "pandas\io\excel\_base.py", line 799, in __init__
File "pandas\io\common.py", line 651, in get_handle
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Usuario\\Desktop\\test\\historical.xlsx'
[30112] Failed to execute script test
Я также пробовал этот ответ, но появляется та же ошибка.
Мне интересно, будет ли работать аналогичный подход, который я использовал для обхода проблемы .txt, но AFAIU этот подход в значительной степени соответствует тому, что я вижу во вспомогательной функции выше.
EDIT: следующий фрагмент также не работает в .exe, но работает непосредственно из Spyder
with pandas.ExcelWriter(os.path.join(cwd, historical_filename), engine = "openpyxl", mode = "a") as writer:
df_multiples_boost_only_valid_historical.to_excel(writer, index = False)
writer.close()
Любая помощь в этом будет принята с благодарностью!