質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3068閲覧

pyinstallerでexe化した時に、exe本体のパスと同一フォルダのexcelファイル(複数シート)にデータを書き込みたい。

H.K2

総合スコア88

PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/06/19 22:15

編集2021/06/19 22:26

前提・実現したいこと

とある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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/06/19 22:18

で、しつもんはなんでしょうか
H.K2

2021/06/19 22:27

申し訳ありません。PCが固まってしまって、再起動する際に間違えて途中投稿してしまったようです。追記しました。
guest

回答1

0

ベストアンサー

google翻訳
KeyError: 「アーカイブに「[Content_Types] .xml」という名前のアイテムがありません」
IndexError:少なくとも1枚のシートが表示されている必要があります

どちらも、sys.argvを使ってパスを取得し、開こうとしたところのエラーではないようです。
他のコードを全部削除して実行してみたらどうでしょう

カレントディレクトリというのは基本、実行しているディレクトリになります
実行ファイルのあるディレクトリを取得し、カレントディレクトリに設定しましょう

投稿2021/06/19 22:34

y_waiwai

総合スコア88022

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

H.K2

2021/06/19 22:59

本コードは、実際のコードから、今回の質問に関係しないであろう処理をほぼ削除して 実施した結果なのですが、これ以上削除するのでしょうか。
y_waiwai

2021/06/19 23:05

まずは、 > ②exe化した時に、exe本体と同一パスを取得するには、どうするのが一番良いでしょうか。 これを確認しなければなりませんが、それをするのにそのエラーが出てる箇所というのは必要なんですか?
H.K2

2021/06/19 23:47

おっしゃる通りですね…。削除して下記のコードでカレントパスに設定したら動作しました。 exe_path = Path(sys.argv[0]).parent os.chdir(exe_path)   なお、 met_dst = exe_path / Path("test.xlsx")   で設定した場合も,exe化しても動くようなので、もしかしたら何かいらないコードが残っていたのかもしれません…。失礼しました…。   本番コードでは試せてないですが、週明けに確認してみます。お騒がせしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問