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

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

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

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

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

Q&A

解決済

1回答

1590閲覧

heroku環境でpyautoguiをデプロイ時のエラー

yamayamar

総合スコア4

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

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

0グッド

0クリップ

投稿2021/10/23 15:34

前提・実現したいこと

heroku環境でpyautoguiをデプロイしたい。

発生している問題・エラーメッセージ

あるpyファイルでpyautoguiモジュールを利用しているので、下記コマンドを実行してプッシュしようとすると下記のエラーなりました。

pip freeze > requirements.txt git add requirements.txt git push heroku master

エラー文

Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 6 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 1.46 KiB | 1.46 MiB/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: Compressing source files... done. remote: Building source: remote: remote: -----> Building on the Heroku-18 stack remote: -----> Using buildpacks: remote: 1. heroku/python remote: 2. https://github.com/heroku/heroku-buildpack-google-chrome remote: 3. https://github.com/heroku/heroku-buildpack-chromedriver remote: -----> Python app detected remote: -----> Using Python version specified in runtime.txt remote: ! Python has released a security update! Please consider upgrading to python-3.8.12 remote: Learn More: https://devcenter.heroku.com/articles/python-runtimes remote: -----> Requirements file has been changed, clearing cached dependencies remote: -----> Installing python-3.8.2 remote: -----> Installing pip 20.2.4, setuptools 57.5.0 and wheel 0.37.0 remote: -----> Installing SQLite3 remote: -----> Installing requirements with pip remote: Collecting async-generator==1.10 remote: Downloading async_generator-1.10-py3-none-any.whl (18 kB) remote: Collecting attrs==21.2.0 remote: Downloading attrs-21.2.0-py2.py3-none-any.whl (53 kB) remote: Collecting certifi==2021.10.8 remote: Downloading certifi-2021.10.8-py2.py3-none-any.whl (149 kB) remote: Collecting cffi==1.15.0 remote: Downloading cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (446 kB) remote: Collecting charset-normalizer==2.0.7 remote: Downloading charset_normalizer-2.0.7-py3-none-any.whl (38 kB) remote: Collecting cryptography==35.0.0 remote: Downloading cryptography-35.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.7 MB) remote: Collecting h11==0.12.0 remote: Downloading h11-0.12.0-py3-none-any.whl (54 kB) remote: Collecting idna==3.3 remote: Downloading idna-3.3-py3-none-any.whl (61 kB) remote: Collecting MouseInfo==0.1.3 remote: Downloading MouseInfo-0.1.3.tar.gz (10 kB) remote: Collecting outcome==1.1.0 remote: Downloading outcome-1.1.0-py2.py3-none-any.whl (9.7 kB) remote: Collecting Pillow==8.4.0 remote: Downloading Pillow-8.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB) remote: Collecting PyAutoGUI==0.9.53 remote: Downloading PyAutoGUI-0.9.53.tar.gz (59 kB) remote: Collecting pycparser==2.20 remote: Downloading pycparser-2.20-py2.py3-none-any.whl (112 kB) remote: Collecting PyGetWindow==0.0.9 remote: Downloading PyGetWindow-0.0.9.tar.gz (9.7 kB) remote: Collecting PyMsgBox==1.0.9 remote: Downloading PyMsgBox-1.0.9.tar.gz (18 kB) remote: Installing build dependencies: started remote: Installing build dependencies: finished with status 'done' remote: Getting requirements to build wheel: started remote: Getting requirements to build wheel: finished with status 'done' remote: Preparing wheel metadata: started remote: Preparing wheel metadata: finished with status 'done' remote: Collecting pyobjc==7.3 remote: Downloading pyobjc-7.3-py3-none-any.whl (3.0 kB) remote: Collecting pyobjc-core==7.3 remote: Downloading pyobjc-core-7.3.tar.gz (684 kB) remote: ERROR: Command errored out with exit status 1: remote: command: /app/.heroku/python/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-ig1wtyeo/pyobjc-core/setup.py'"'"'; __file__='"'"'/tmp/pip-install-ig1wtyeo/pyobjc-core/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-8873wzg3 remote: cwd: /tmp/pip-install-ig1wtyeo/pyobjc-core/ remote: Complete output (2 lines): remote: running egg_info remote: error: PyObjC requires macOS to build remote: ---------------------------------------- remote: ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output. remote: ! Push rejected, failed to compile Python app. remote: remote: ! Push failed remote: Verifying deploy... remote: remote: ! Push rejected to korianexport. remote: To https://git.heroku.com/korianexport.git ! [remote rejected] master -> master (pre-receive hook declined)

エラー文の中にPyObjC requires macOS to buildという記載があるのですが、PyObjCに依存するpyautoguiはHeroku環境で利用できないということになるのでしょうか?
回避方法あればご教授可能でしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

前提として

  • 質問文の内容から、pipなどを始めとした各コマンドのローカル環境が macOSであることを想定しています
  • この回答自体は、実現目標である「heroku環境でpyautoguiをデプロイしたい。 」の解決に直接到達しない可能性があります

問題点と解決法

heroku側で依存ライブラリをインストールするための情報として、requirements.txtを生成していますが、この際の以下のコマンドに問題があります。

pip freeze > requirements.txt

一度、次のどちらかをした上で、commit->pushしてみてください。

  • requirements.txtの中から、今回herokuにデプロイしたいアプリケーションに「直接依存しているもの」をピックアップして、それ以外を全て削除してpushしてみてください。(例えば、後述の理由でPyObjなどは直接依存していないはずなので、削除する。など)
  • pip list --not-required --format freeze > requirements.txt を作り直す(未確認)

原因の詳細

PyAutoGUIはドキュメントなどにある通り、クロスプラットフォームで動作します。
もちろんLinuxでも動作する設計になっていますし、Herokuの実行環境であるdynoはLinuxコンテナなので、Pythonライブラリとしてのインストール自体は問題なく出来るはずです。

PyAutoGUIの依存ライブラリはsetup.py(GitHub)に記載されているコードのとおりなのですが、OSとPythonのバージョンによって依存するものが違ってきます。
Linux環境で動作させる場合は、platform_system=="Linux"となっている箇所とこういった条件限定がされていないものがインストールされるようになっています。
PyObjはplatform_system=="Darwin"とあるように、macOSでのインストール時にのみ依存しています。

ここで、pip freezeが問題になってきます。
pip freezeは、その環境下にある「インストール済みの全パッケージの名前とバージョン」を列挙するものです。
前提にある通りmacOS上でPyAutoGUIをインストールした場合、前述の通り依存関係にPyObjが含まれているため一緒にインストールされています。
そのため、直接的には必要なにもかかわらずPyObjもpip freezeの対象となって出力されてしまいます。
heroku側はLinux環境のため、PyObjのビルド等は基本的に出来ません。
そのために、デプロイしてもエラーになってしまっています。

安定的な対応としては、requirements.txtの生成にpip freezeを用いずに、pip installなどのタイミングで都度ファイルに追記するほうがこういった事故は起きにくくなると思います。
(OSが違う環境下を想定するならなおさら)

参考

pipコマンドの解説記事

投稿2021/10/23 16:00

attakei

総合スコア2738

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

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

yamayamar

2021/10/24 03:21

@attakei pip list --not-required --format freeze > requirements.txt 上記コマンド実行によって依存されていないライブラリをfreezeフォーマットでrequirements.txtに記載しコミット、プッシュすると該当のエラーは出なくなり、デプロイできたようです!(現在他の不具合に苦闘中w)。質問してから短期間に回答いただき大変ありがとうございます。 PyAutoGUIの依存ライブラリがOSとPythonのバージョンによって依存するものが違ってくるということを初めて知り、今後の活動に活かして参りたいと思います。 ちなみにrequirements.txtの役割というのはインストールする必要があるライブラリのリストという理解なのですが、上記のコマンドによってpyAutoGUIの依存ライブラリ(pyobjcなど)が記載されなくなった結果、pyobjcなどが無くてもpyAutoGUIは正常に動作するのでしょうか?現在今回の件とは無関係の不具合に対応中でまだ未確認なのですが今後のために参考にさせていただきたいです。
attakei

2021/10/24 06:44

> ちなみにrequirements.txtの役割というのはインストールする必要があるライブラリのリスト 自分としてもその理解に大きな乖離はありません。 ただし、自分の中では回答にもある通り「そのアプリケーションにとって直接的に必要とするもの」のみと捉えています。 「依存関係の全てを記述しない」のは、結局のところこのファイルでpip installを実行する際に、パッケージの依存関係は自動で解決してくれるため記述する必要性が無いためです。 ※おそらくですが、PyAutoGUIのインストール時も pip install pyautogui のみをしていて pip install pyobj はしてないのではないでしょうか > ~pyobjcなどが無くてもpyAutoGUIは正常に動作するのでしょうか? 前述の点を踏まえて、実際にherokuへのpush時にデプロイで来ていることから、PyAutoGUIのインストール時に「Linux環境上でPyAutoGUIコア部分を動作するのに最低限必要なPythonパッケージ」は一緒にインストールされていると思います。 デプロイ時のインストールログなどにpython3-Xlibの記述があれば、これが今回の依存ライブラリです。 PyAutoGUIの振る舞いを信じる限り、OSごとに必要な依存ライブラリを中継して正常動作を保障してくれるとは思います。
yamayamar

2021/10/29 14:20

@attakei ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問