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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

2846閲覧

Pythonで書いたGUIプログラムを、Mac用のターミナルを開かない実行ファイルにしたい

TKKN

総合スコア2

PyInstaller

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2021/05/26 18:39

編集2021/05/26 19:54

概要

pythonで作成したプログラムをターミナルを開かない実行ファイルとしてMac OSで動作させたいです。

プログラムの内容としましては、
・PySimpleGUIでUI動作
・Seleniumでスクレイピング
・CSVでデータ管理
・サーバーのPHPとログデータやりとり
と言った感じです。

現状、pyinstaller、py2app、cx_freezeのどれかを使うことを考えているのですが、なかなか上手くいきません。

環境

  • macOS Catalina バージョン10.15.7
  • pyenv Python 3.6.5

試した事

pyinstaller

ターミナルからpyinstaller /Users/myname/hoge/fuga/main.py --onefile --noconsoleコマンドで実行ファイルを作成すると、main(拡張子ナシ)とmain.appが作成される。
mainをダブルクリックするとプログラムは正常に動作するが、同時にターミナルが開く。
main.appをダブルクリックすると、Dockのすみっこでアイコンが何回かバウンドして消えるだけ…

なお、同様の方法でWindowdでpyinstallerを使用し同じプログラムを実行ファイル化したところ、Windowsではコマンドプロンプトも開かず期待通りに動作するmain.exe実行ファイルは作成できた。

参りました


py2app

ターミナルよりpy2applet --make-setup /Users/myname/hoge/fuga/main.pyコマンドでsetup.pyを作成。setup.pyの内容は以下

Python

1""" 2This is a setup.py script generated by py2applet 3 4Usage: 5 python setup.py py2app 6""" 7 8from setuptools import setup 9 10APP = ['/Users/myname/hoge/fuga/main.py'] 11DATA_FILES = [] 12OPTIONS = {} 13 14setup( 15 app=APP, 16 data_files=DATA_FILES, 17 options={'py2app': OPTIONS}, 18 setup_requires=['py2app'], 19) 20

そしてpython setup.py py2appコマンド実行、main.appが作成される。
ダブルクリックで起動すると下記の添付画像のウィンドウが開くのみ。
イメージ説明

ちなみにmain.appのパッケージ内容であるmain.app/Contents/MacOS/mainを実行すると、上記と同様のウィンドウとともにターミナルが開き

Traceback (most recent call last): File "pandas/__init__.pyc", line 30, in <module> File "pandas/_libs/__init__.pyc", line 13, in <module> File "pandas/_libs/interval.pyc", line 14, in <module> File "pandas/_libs/interval.pyc", line 10, in __load File "imp.pyc", line 343, in load_dynamic File "pandas/_libs/interval.pyx", line 1, in init pandas._libs.interval File "pandas/_libs/hashtable.pyc", line 14, in <module> File "pandas/_libs/hashtable.pyc", line 10, in __load File "imp.pyc", line 343, in load_dynamic File "pandas/_libs/hashtable.pyx", line 1, in init pandas._libs.hashtable File "pandas/_libs/missing.pyc", line 14, in <module> File "pandas/_libs/missing.pyc", line 10, in __load File "imp.pyc", line 343, in load_dynamic File "pandas/_libs/missing.pyx", line 1, in init pandas._libs.missing File "pandas/_libs/tslibs/__init__.pyc", line 30, in <module> File "pandas/_libs/tslibs/conversion.pyc", line 14, in <module> File "pandas/_libs/tslibs/conversion.pyc", line 10, in __load File "imp.pyc", line 343, in load_dynamic File "pandas/_libs/tslibs/conversion.pyx", line 1, in init pandas._libs.tslibs.conversion ModuleNotFoundError: No module named 'pandas._libs.tslibs.base' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/Users/myname/Desktop/py2app_test/dist/main.app/Contents/Resources/__boot__.py", line 81, in <module> _run() File "/Users/myname/Desktop/py2app_test/dist/main.app/Contents/Resources/__boot__.py", line 66, in _run exec(compile(source, path, 'exec'), globals(), globals()) File "/Users/myname/Desktop/py2app_test/dist/main.app/Contents/Resources/main.py", line 9, in <module> import pandas as pd File "pandas/__init__.pyc", line 38, in <module> ImportError: C extension: No module named 'pandas._libs.tslibs.base' not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext --inplace --force' to build the C extensions first. 2021-05-27 02:26:28.141 main[53263:3611995] main Error

とのエラーメッセージが表示される。

参りました


cx_freeze

setup.py作成。

Python

1# -*- coding: utf-8 -*- 2 3import sys 4from cx_Freeze import setup, Executable 5 6base = None 7if sys.platform == 'win32': 8 base = 'Win32GUI' 9 10executables = [ 11 Executable('main.py', base=base) 12] 13 14setup(name='main', 15 version='0.1', 16 executables=executables 17 )

main.pyをtest.pyと同じフォルダに置いて
python setup.py bdist_macコマンド実行。
するとbuildフォルダ内にmain-0.1.appが作成されるが、ダブルクリックするとまたDockでアイコンが跳ねて消える…
ちなみにmain-0.1.appのパッケージ内、main-0.1.app/Contents/MacOS/mainという実行ファイルをダブルクリックすると、ターミナルは開いてしまうが動作はする模様(なぜかGUIの解像度がエライ低いが…)
また、build/exe.macosx-10.15-x86_64-3.6/mainに作成されている実行ファイルをダブルクリックすると、ターミナルは開いてしまうが動作はする。(GUI解像度も通常)

参りました

参考?

参考になるかわかりませんが、main.pyで使用しているライブラリを添付します。

Python

1 2import base64 3import csv 4import datetime as dt 5import glob 6import hashlib 7import hmac 8import json 9import os 10import pandas as pd 11import PySimpleGUI as sg 12import random 13import requests 14from selenium import webdriver 15from selenium.webdriver.common.keys import Keys 16from selenium.webdriver.common.action_chains import ActionChains 17import socket 18import sys 19import threading 20import time 21import traceback 22import urllib.parse 23from webdriver_manager.chrome import ChromeDriverManager 24

まとめ

Mac OSでターミナルを開かずGUIで動作する実行ファイルを作り(配布し)たいだけなのに…難しいですね…
他に記述すべき事がありましたらご指摘いただけたら、随時更新させていただきますので、何か打開策をご教授いただけたら幸いです。

何卒よろしくお願い申し上げます...!!!!!!!!!!!!!!!!

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

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

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

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

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

guest

回答1

0

自己解決

##結論
コマンドから実行していた時と実行ファイルを実行していた時とで、デフォルトエンコーディング?が違っていたことが分かった(分かってない)
これを回避するためにimportがたくさん並んだ後あたりに

Python

1import io,sys 2sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

と書くことで、実行ファイル化した後もデフォルトエンコーディングが適応される場面でUTF-8エンコードしてくれるらしく(分かってない)
とりあえず無事に、各ツールで作った.appは動作してくれた。

# -*- coding: utf-8 -*-とか書くやつか!って書いてみたが、これだけではダメだった)

ここまでの道のり

そもそもターミナルを表示させたくなくて奔走しているわけだが、ターミナルが無いおかげでエラー内容が見れ無くて困っていたのであった。見えるのはdockで跳ねては消えてゆく.appアイコンだけ…

という事で、エラー内容を残すためにスクリプト全体を覆うような形のtryとエラー内容をテキストファイルに書き出すexceptを追記した上で各実行ファイル化ツールで.app作成。

Python

1try: 2 3 #コード内容全体 4 5except Exception as e: 6 message = list(traceback.TracebackException.from_exception(e).format()) 7 8 #出来るだけ確実に書き出したかったので、絶対パスを直接指定してみた 9 path = '/Users/myname/Desktop/error_message.txt' 10 11 with open(path, mode='w') as f: 12 for row in message: 13 f.write(row)

実行してみたところこんなようなエラー内容を見る事ができた。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-12: ordinal not in range(128)

str型の日本語をprintしている部分でエラーになっていた模様。
エラーが見えた事でだいぶ視界が開けて、少し調べたところいくつかの記事にたどり着き、ひとまず動作にこじつける事ができました。参考にさせていただいたリンクを貼っておきます。
Pythonで日本語のエンコードエラーが発生したときの対応策
PythonのUnicodeEncodeErrorを知る

おまけ?

質問文で少し触れた、cx_freezeで作った実行ファイルのGUIの解像度がエライ低い問題も調べたらすぐに解決したので、参考にさせていただいたページのリンクを貼っておきます。
[Python][tkinter]cx_Freezeでパッケージ化するappファイルをRetinaディスプレイに対応させる方法

感想

「GUIが一瞬開いて消えるだけ」という状態をいろいろ調べまくったがお手上げ、ここで質問するに至ったわけですが、その状態で調べまくる前にエラー内容を捕獲しようとすべきでした。この方が百倍近道だったなと実感した…
誰かの参考になったらなと思います。何か必要な追記事項ありましたらリクエストください。
また、もっといい方法あるよ〜とかその他もろもろアドバイスもありましたら是非ください、よろしくお願いします!!!

投稿2021/05/27 17:05

TKKN

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問