前提・実現したいこと
とあるExcel(すでに既存のデータがある)ファイルに対し、
pandasで加工したデータセットを複数のシートに書き込む処理を作り、exe化したいと考えています。
通常のスクリプトと仕手なら実行できるのですが、python環境がないPCでも実施したく、
pyinstallerでexe化して実行した場合、exeと異なるパスからコマンドプロンプトで実施すると、
パスが存在しないといわれてしまいました。パスを取得するためにpathlib(file).resolveなどを
使って、出てくるパスをprint出力などで確認しても、全く関係のないパスが表示されてしまいます。
そのため、sys.argvを使ってパスを取得し、開こうとしたら、下記のエラーメッセージが出てしまいました。
お聞きしたいことは下記2点です。
①exe化した時に、パスが変わってしまうのは、シェルか何かの仕様なのでしょうか。
検索などしてみましたが、いまいち原理が分からないので困っています。
②exe化した時に、exe本体と同一パスを取得するには、どうするのが一番良いでしょうか。
発生している問題・エラーメッセージ
エラーメッセージ C:\Users\agare.conda\envs\minimam\python.exe C:/test/pyinstaller_test_tqdm_px/ng_opx_exec.py <class 'str'> C:\test\pyinstaller_test_tqdm_px\test.xlsx Traceback (most recent call last): File "C:/test/pyinstaller_test_tqdm_px/ng_opx_exec.py", line 16, in <module> exl_w.book = opx.load_workbook(met_dst) File "C:\Users\agare.conda\envs\minimam\lib\site-packages\openpyxl\reader\excel.py", line 314, in load_workbook reader.read() File "C:\Users\agare.conda\envs\minimam\lib\site-packages\openpyxl\reader\excel.py", line 273, in read self.read_manifest() File "C:\Users\agare.conda\envs\minimam\lib\site-packages\openpyxl\reader\excel.py", line 134, in read_manifest src = self.archive.read(ARC_CONTENT_TYPES) File "C:\Users\agare.conda\envs\minimam\lib\zipfile.py", line 1464, in read with self.open(name, "r", pwd) as fp: File "C:\Users\agare.conda\envs\minimam\lib\zipfile.py", line 1503, in open zinfo = self.getinfo(name) File "C:\Users\agare.conda\envs\minimam\lib\zipfile.py", line 1431, in getinfo 'There is no item named %r in the archive' % name) KeyError: "There is no item named '[Content_Types].xml' in the archive" During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:/test/pyinstaller_test_tqdm_px/ng_opx_exec.py", line 21, in <module> clear_df.to_excel(exl_w, sheet_name="ccc", index=False, header=False) File "C:\Users\agare.conda\envs\minimam\lib\site-packages\pandas\io\excel\_base.py", line 777, in __exit__ self.close() File "C:\Users\agare.conda\envs\minimam\lib\site-packages\pandas\io\excel\_base.py", line 781, in close return self.save() File "C:\Users\agare.conda\envs\minimam\lib\site-packages\pandas\io\excel\_openpyxl.py", line 43, in save return self.book.save(self.path) File "C:\Users\agare.conda\envs\minimam\lib\site-packages\openpyxl\workbook\workbook.py", line 392, in save save_workbook(self, filename) File "C:\Users\agare.conda\envs\minimam\lib\site-packages\openpyxl\writer\excel.py", line 293, in save_workbook writer.save() File "C:\Users\agare.conda\envs\minimam\lib\site-packages\openpyxl\writer\excel.py", line 275, in save self.write_data() File "C:\Users\agare.conda\envs\minimam\lib\site-packages\openpyxl\writer\excel.py", line 89, in write_data archive.writestr(ARC_WORKBOOK, writer.write()) File "C:\Users\agare.conda\envs\minimam\lib\site-packages\openpyxl\workbook\_writer.py", line 148, in write self.write_views() File "C:\Users\agare.conda\envs\minimam\lib\site-packages\openpyxl\workbook\_writer.py", line 135, in write_views active = get_active_sheet(self.wb) File "C:\Users\agare.conda\envs\minimam\lib\site-packages\openpyxl\workbook\_writer.py", line 33, in get_active_sheet raise IndexError("At least one sheet must be visible") IndexError: At least one sheet must be visible
該当のソースコード
Python
1import pandas as pd 2import numpy as np 3import openpyxl as opx 4import sys 5from pathlib import Path 6 7if __name__ == "__main__": 8 print(type(sys.argv[0])) 9 10 exe_path = Path(sys.argv[0]).parent 11 12 met_dst = exe_path / Path("test.xlsx") # sys.argvでパスを取得した場合、 13 # met_dst = Path("test.xlsx") # pyinstallerでexe化したら通らなくなる 14 print(met_dst) 15 with pd.ExcelWriter(met_dst, engine="openpyxl") as exl_w: 16 exl_w.book = opx.load_workbook(met_dst) 17 exl_w.sheets = dict((ws.title, ws) for ws in exl_w.book.worksheets) 18 clear_df = pd.DataFrame(np.zeros(300).reshape(20, 15)) 19 clear_df.to_excel(exl_w, sheet_name="aaa", index=False, header=False) 20 clear_df.to_excel(exl_w, sheet_name="bbb", index=False, header=False) 21 clear_df.to_excel(exl_w, sheet_name="ccc", index=False, header=False) 22 # exl_w.book.save(met_dst) 23 print("書込み完了")
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー