4
3

More than 3 years have passed since last update.

PythonでMac上にスタンドアロンアプリをつくってハマった件

Last updated at Posted at 2021-08-24

一年ぶりくらいの投稿

GoogleSpreadsheetの記事書いてたのに今回はPythonです
仕事でちょっとしたPythonツールをつくっていたのですが、職場で共有しようとスタンドアロン化で苦労したので備忘録でメモ書きです

1,前提

Pythonの知識0からのスタート。人のコードはみたことあれど、というところ
Macのアプリつくったことありません(←今回、ここがハマった要因)

2,書くこと

おもにpy2appつかってハマったこと気づいたこと

3.その気があったら

Pythonについておもったことをつらつら後日


最初はPyInstallerをつかってみてた。記事も多かったし。
しかし、うんともすんとも起動しないのでpy2appに手を出す。
(PyInstallerにおそらく同じ問題で解決するんじゃないか疑惑アリ)

アプリの概要

TkinterやとあるサーバアプリのPythonAPIをつかってサーバとデータをやり取り。ログをファイルに書き出し、設定ファイルへ各種情報を保存する

結論だけ先に

ソース上でログ・ファイルを指定している場所が悪い、設定ファイルの指定している場所が悪い、読み込むファイルが(以下略
全部、私が悪かったですごめんなさい
スクリプトでは問題ない指定でもアプリ化するときは気をつける必要がありました

手順

py2appでアプリ化
これ自身は難しくない
以下、VSCodeのターミナル上でのお話
py2App自身は

%pip install py2app

でよいし、そのあと、アプリ化するpyファイルのあるところで以下コマンド

%py2applet --make-setup UmeUme.py

これで、setup.pyができる

setup.py
>from setuptools import setup
APP = ['UmeUme.py']
DATA_FILES = []
OPTIONS = {}
setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

↑テンプレファイル。普通はなんもいじらない(←ここがダウトだった)

次に

$python setup.py py2ap

で、distフォルダにUmeUmeができあがる
ここで、UmeUmeをポチッとな、とするとアプリが起動、、、、しませんでした
動こうとしてアイコンがでてくるけど、しばらくしたら消える

早速Google先生に聞いてみます。いっぱいでてきます。
容疑者

1)Python自身(Brew版をいれるべし。--enable-frameworkオプションをいれるべし等)
2)Tkinterとtcltk(1をおこなったらなぜかバージョンが8.6から8.5へなってしまった)
3)自分自身のコード ←犯人はこいつだ!

Pythonをいれなおし、tcltkをいれなおし、Tkinterをいれなおしたけど、うごかず。

コンソールアプリでログをみてもExitしたよん、ってエラーしかでてなく
Macでアプリ化なんて無理だ!(M1になっていろいろ変わったとかあったり)
とおもったところで、初心にもどって(違う)、素の状態なら動くよね?と

UmeUme.pyからいろんな記述をコメントアウトしていき、Tkinterだけにしたら起動した(当たり前)

UmeUme.py
import tkinter as tk
def  main():
    main = tk.Tk()
    main.mainloop()

if __name__ == '__main__':
    main()

1つ1つふやしていくと、ログを設定してるところを有効にするとまたしても起動せず
↑そもそもログが吐き出されてないのでなんで動かないのかわからないのだった

ファイルに書き込めないのかなー、と、ググる

アプリのパッケージを開き、MacOSフォルダにあるアプリファイルをコンソールから実行してみて
“right click -> Show Packages -> Resources -> Mac OS”, and execute your app directly do help, because it shows specific errors on the console

という一文をStackOverflow様

Py2app Can't read file

でみつける
実行すると、アプリがちゃんとエラーを吐いてました

FileNotFound(UmeUme.py:25)

結果からいうと、Macでアプリ化した場合のカレントフォルダの認識がアプリ下の階層になってしまうので、パスの指定に気を配る必要があるんですね
ログファイル→アプリと同じフォルダの下にLogsフォルダをつくってた→とりあえず、相対パスの指定を変更
 (ここは実際には要変更。Macのアプリのログの指定の仕方を調べないと・・・)
設定ファイル→setup.pyのDATA_FILESに記載→ビルド時にResourcesにコピーしてくれる
読み込むファイル→setup.pyのDATA_FILESに記載→ビルド時にResourcesにコピーしてくれる

具体的には以下

__file__  #アプリのファイルパスをとる NGやった

argv[0] #こちらはうごく
setup.py
DATA_FILES = ['UmeUme.json']

でバッチリ起動しました。
考えてみれば、Macとかでアプリ化するって、UIつくものばかりだから、Tkinterで動かないわけがないんですよね
ググって逆にハマった典型でした

こんなアホなところではまらんとは思いますが、同じところで躓くひとがもしいたら参考になれば、と。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3