前提・実現したいこと
python1年生のpillowを使って画像を扱う課題でエラーがでています
環境
macOs Big sur
python 3.8.7
python IDEL
ここに質問の内容を詳しく書いてください。
コードのなかでモジュールをimportするとエラーになります
python
1 2import tkinter as tk 3import tkinter.filedialog as fd 4import PIL.Image 5import PIL.ImageTk 6 7def dispPhoto(path): 8 #画像を読み込む 9 newImage = PIL.Image.open(path).resize((300,300)) 10 #そのイメージをラベルに表示する 11 imageDate = PIL.ImageTk.PhotoImage(newImage) 12 imageLabel.configure(image = imageDate) 13 imageLabel.image = imageDate 14 15 16def openFile(): 17 fpath = fd.askopenfilename() 18 19 if fpath: 20 dispPhoto(fpath) 21 22 23 24 25root = tk.Tk() 26root.geometry("400x350") 27 28btn = tk.button(text="ファイルを開く",command = openFile) 29imageLabel = tk.Label() 30btn.pack() 31imageLabel.pack() 32tk.mainloop()
この頭のimport PIL.Imageでエラーがでているようでした
■■な機能を実装中に以下のエラーメッセージが発生しました。
以下が実行する表示されるエラーメッセージです
Traceback (most recent call last): File "/Users/###/Desktop/python1nenn/displayimage.py", line 3, in <module> import PIL.Image ModuleNotFoundError: No module named 'PIL'
試したこと
pipのバージョンの更新などを行ってみました
pipやpip3などの入力でも試してみました
補足情報(FW/ツールのバージョンなど)
Package Version
Pillow 8.1.0
pip 21.0
setuptools 52.0.0
各バージョンです
idleを使わず、ターミナルで
python /Users/###/Desktop/python1nenn/displayimage.py
を実行したら、どうなりますか?
(python は python3 かも)
ターミナルでidleを起動すると、python 3.8.7ではない別のpythonが使われるかもしれません
「アプリケーションフォルダ」の「Python 3.8」の中に「IDLE」があれば、それを実行してみてください
参考
https://teratail.com/questions/318476
https://daeudaeu.com/python-gui-install/#i-2
ご返答ありがとうございます
ターミナルで上記のコードを実行してみた場合は
zsh: no such file or directory:
このような返答がきました
> zsh: no such file or directory:
その後には何て書いてあります?
省略されると、何が起きてるか他人が理解しにくくなります
申し訳ありません
zsh: no such file or directory: python3/User/###/Desktop/python1nenn/displayimage.py
この様な返答がありました
###のところ私の名前でした
python3 と /User の間にスペースを入れてください
あと、/User/ は /Users/ です
タイプミスだと思いますが、念のため
訂正ありがとうございます
修正し実施してみましたらエラーが変わりました
Traceback (most recent call last):
File "/Users/###/Desktop/python1nenn/displayimage.py", line 1, in <module>
import tkinter as tk
File "/Users/###/.pyenv/versions/3.8.7/lib/python3.8/tkinter/__init__.py", line 36, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'
やっぱり、idleで動かしてるpythonと、pipでPillowを入れたpythonが異なっているような
下記をファイルに保存して、ファイル名の末尾を.pyにして、idleとターミナルでそれぞれ実行した結果を教えてください
import sys
import pprint
pprint.pprint(sys.path)
名前等はもちろん伏せ字でいいですが、できるだけ省略せずに教えてください
あと、
pip show Pillow
の結果の中の
Location:
の行に何て書かれてるかを教えてください
(pipはpip3かも)
確認をお願いします
こちらがIDLEで実行した結果です
=========== RESTART: /Users/###/Desktop/python1nenn/hello.py ==========
['/Users/###/Desktop/python1nenn',
'/Users/###/Documents',
'/Library/Frameworks/Python.framework/Versions/3.8/lib/python38.zip',
'/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8',
'/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload',
'/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages']
>>>
ターミナルでの結果もお願いします
idleと比較するので
あと、pip show... (またはpip3 show...) の結果もお願いします
ターミナルで実行しているのがpython3なら、おそらくpip3でしょう
ターミナルで実行する方法に時間がかかってしいました。
ターミナルでの実行結果はこちらです
(base) ###@###noMacBook-Pro Desktop % python hello.py
['/Users/###/Desktop',
'/Users/###/.pyenv/versions/3.8.7/lib/python38.zip',
'/Users/###/.pyenv/versions/3.8.7/lib/python3.8',
'/Users/###/.pyenv/versions/3.8.7/lib/python3.8/lib-dynload',
'/Users/###/.pyenv/versions/3.8.7/lib/python3.8/site-packages']
(base) ###@###noMacBook-Pro Desktop %
実はターミナルからファイルを実行したことがなく戸惑っていました、補足としてターミナルでこの様に実行してファイルの実行を行いました
cd Desktop
pwd
python 保存したファイル名.py
参考にしたサイトはこちらです
https://aiacademy.jp/media/?p=117
pip show Pilloの実行結果です
ターミナル
(base) ###@###noMacBook-Pro Desktop % pip show Pillow
Name: Pillow
Version: 8.1.0
Summary: Python Imaging Library (Fork)
Home-page: https://python-pillow.org
Author: Alex Clark (PIL Fork Author)
Author-email: aclark@python-pillow.org
License: HPND
Location: /Users/###/.pyenv/versions/3.8.7/lib/python3.8/site-packages
Requires:
Required-by: matplotlib
ターミナルではpip show ...も pip3 show...の実行結果も一緒でした
IDLEではエラーで実行できませんでした
>>> pip3 show pillow
SyntaxError: invalid syntax
>>> pip show Pillow
SyntaxError: invalid syntax
>>>
やはり、idleのpythonとターミナルのpythonは別物ですね
おそらく、
idleのpythonは公式版を入れたそのまま
ターミナルのpythonはpyenvの仮想環境のもの
でしょう
(どちらも、質問者さんが入れたのですよね?)
それぞれ、pipで入れたモジュールが下記にあればimportできます
idle:/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages
ターミナル:/Users/###/.pyenv/versions/3.8.7/lib/python3.8/site-packages
idleの方ではimportできないので、おそらく、pip(またはpip3)で入れたPillowは、
/Users/###/.pyenv/versions/3.8.7/lib/python3.8/site-packages
に入っているのでしょう
pip show Pillow (またはpip3 show Pillow) の結果を教えてもらえば、はっきりしますけど
どこに入ってるかは、それの「Location:」の行に表示されます
【追記】一つ前のコメントを読む前に投稿してしまいました
> Location: /Users/###/.pyenv/versions/3.8.7/lib/python3.8/site-packages
やはり、ターミナルのpythonからimportできるところに入ってますね
そこだと、現在idleで使ってるpythonからは見えません
idleで使ってるpython側にPillowを入れるか、ターミナルと同じpythonをidleから使うか、どちらかをする必要があります
idleをどうやって起動しているか、教えてください
ターミナルで
idle
を入力してますか?
他の方法ですか?
#############
「idleをどうやって起動しているか、教えてください」
#############
Idleはpythonをインストールした際に一緒についてきた「IDLE.app」からいつも立ち上げています
jbpb0さんがおしゃっているターミナルから起動するやり方は行った事がないです
先のご返答の中に
#############
やはり、idleのpythonとターミナルのpythonは別物ですね
おそらく、
「idleのpythonは公式版を入れたそのまま
ターミナルのpythonはpyenvの仮想環境のもの
でしょう
(どちらも、質問者さんが入れたのですよね?)」
#############
これに関してはその通りです
その時の作業が影響している様に思われるので補足させてください
pythonを公式からインストールを行った後にvscodeで作業をするようまた別の書籍にあったのでそうしました
この時macのターミナルでは確かpython 3.8.7 ?
(だっと思います、とにかく3系と言われるpythonが反映されていました
確認方法はmacのターミナルで python -V と入力してバージョンを確認しました)
しかし、vscodeでpythonのファイルを作成して
vscodeのターミナルに 「python -作成したファイル名.py」これで実行すると日本語などの処理ができないエラーがでました
(print('こんにちは')⇦出力不可 print('hello') ⇦出力される など)
この時、vscodeのターミナルにてpythonのバージョンを確認(python -V)したら、python 2.7.? あたりで2系と言われるpythonで処理が行われていました。
調べると、macに標準インストールされているpythonのバージョンだったと思います
これを改善するため色々調べていて参考にしたサイトがこちらです
https://prog-8.com/docs/python-env
この作業の流れでhomebrewとpyenvをインストールしました
作業はmacのターミナルで実行したと思います
この作業のあとはvscodeでも3系のpythonでvscodeのターミナルでも反映されるようになりました
ご返答の中にあった「仮想環境」に関しては私はどこからその作業を行っているのか自分では分かっていないです
> Idleはpythonをインストールした際に一緒についてきた「IDLE.app」からいつも立ち上げています
の「python」は、最初に入れた公式版ですか?
そうならば、そのidleは最初に入れた公式版pythonとつながっているので、後で入れたpyenv版pythonとは関係なく、今でもそのidleでは公式版pythonが使われてしまいますね
> この作業の流れでhomebrewとpyenvをインストールしました
の時点で、ターミナルから使うコマンドがpyenvで入れたのが最優先になったため、pip3で入れるとpyenv版python用のところに入ってしまい、公式版pythonからはimportできないのでしょう
> この作業のあとはvscodeでも3系のpythonでvscodeのターミナルでも反映されるようになりました
ということなら、VS Codeで動いてるpythonは、たぶんpyenv版だと思います
となると、おそらくidleだけ違うpython(公式版)を使ってるような
>最初に入れた公式版ですか?
その通りです、公式版のインストールに付属していたものです
jbpb0さんの推測から公式版に付随したIDLE.appのIDLE Shellにて
pip list
pip3 list
のどちらも実行してみましがどちらも
SyntaxError: invalid syntax
との実行結果になりました
私は公式版pythonではpipのインストールができていないとい言うことで間違いないでしょうか?
idleはpythonのプログラムしか実行できませんので、pipのようなターミナルで実行するコマンドは実行できません
公式版のコマンドは、たぶん
/Library/Frameworks/Python.framework/Versions/3.8/bin
にあると思います
それを確認するために、ターミナルで
ls /Library/Frameworks/Python.framework/Versions/3.8/bin
を実行してみてください (「ls」の次にはスペースがあります)
そうすると、そこにあるファイルの一覧が表示されます
たぶん、pipとかpythonとか、他いろいろあると思います
そこの優先順位をpyenvよりも上げるように設定すれば、公式版pythonにPillowを入れることができるはずですけど、そうしますか?
ただし、その設定をしたら、逆にpyenv版pythonを使うのが、今よりも不便になります(優先度が下がるため)
実行の結果はこちらでした
base) ###@###noMacBook-Pro ~ % ls /Library/Frameworks/Python.framework/Versions/3.8/bin
2to3 pip3 python3-config
2to3-3.8 pip3.8 python3.8
easy_install-3.8 pydoc3 python3.8-config
idle3 pydoc3.8
idle3.8 python3
私も解決としては公式版pythonにpillowをと思います
お話を聞くかぎり私のpyenv版pythonは、私自身が理解していないのもあり
作業の影響などで今後も問題を生む可能性が感じられます
しかし、問題があるとすればターミナルやvscodeでの利用する場合のpythonへの影響です
お話だとこれらはpyenv版pythonで実行されている様なので、その問題の解決があればいいのですが
もし問題が生じたら、設定を戻せば大丈夫です
pyenv版は使わなくても、当面は削除せずに放置しておけば、設定を戻せばまた使えるようになります
また、設定を変えたら、おそらくVS Codeからも公式版が使えるようになるんじゃないか、と思います
(が、私はVS Codeを使ってなくてよく知らないので、思うだけです)
設定の変え方ですが、
https://oku.edu.mie-u.ac.jp/~okumura/python/install.html
の「公式サイト Python.org からのインストール(Mac)」の、「さきほど追加されたものを」の次の
PATH=...
からの3行を、
~/.zprofile
の末尾に追加します
ただし、この時に「3.9」のところ(2箇所)は「3.8」に変えます
~/.zprofile
の編集は、テキストファイルを編集できるエディタならば何を使っても大丈夫です
VS Codeでもできると思いますし、MacOSに付いてるテキストエディットでもできます
ただし、万が一必要なところを間違えて削除したりしてもいいように、編集の前にコピーを作っておいてください
~/.zprofile
を編集して保存したら、それ以降にターミナルを起動したら、公式版の優先順位が上がっているので、公式版を使えます
ただし、python3, pip3のように、コマンドに必ず「3」を付けてください
付けないと、たぶんpyenv版のコマンドが実行されてしまいます
次にやることは、上記Webページにも書かれてますが、公式版のpipをアップデートすることです
ターミナルで
pip3 install --user --upgrade pip
を実行してください (一番左はpip3ですが、一番右はpipです)
それが済んだら、Pillow等の必要なものをpip3で入れてください
pip3 install --user Pillow
設定を戻すのは、
~/.zprofile
に追加した3行を削除するだけです
そこを削除して保存したら、それ以降にターミナルを起動したら、pyenv版の優先順位が高い現在の状態に戻ってます
【追記】編集前の ~/.zprofile のコピーさえ残ってれば設定を戻せるので、必ずコピーを保存しておいてください
~/.zprofile
を修正・保存した後に、ターミナルで
which python3
を実行してみてください
その結果が、
/Library/Frameworks/Python.framework/Versions/3.8/bin/python3
となれば、正しく変更できてます
もし
/Users/###/.pyenv/...
みたいに表示されたら、設定が変わってません
修正内容が間違ってないか、保存した時にファイル名が変わってしまってないか、等どこかに間違いがあるので、手順を再確認して、再度実施してください
すいません、私の足らないところですが
> PATH=...
からの3行を、
~/.zprofile
の末尾に追加します
この「末尾」とのことなんですが
~/.zprofile
PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"
PATH="${HOME}/Library/Python/3.8/bin:${PATH}"
export PATH
この形ではなく
~/.zprofile PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"
PATH="${HOME}/Library/Python/3.8/bin:${PATH}"
export PATH
こちらの方が適当なのでしょうか?
また、初歩的な質問なのかもしれないですが
上記のコードはターミナルなどで実行するものなのでしょうか?
それともファイルを作成してそれを保存するだけで完了しているのでしょうか?
ちなみに、macのテキストエディットで貼り付けし編集し保存したときは拡張子が .rtfとなるのですが
こちらは特に気にする必要はないのでしょうか?
一度、テキストエディットで作成し(.rtf)で保存を行ったのですが
ターミナルにて
which python3 を実行したのですが設定が変わっていない方で反応がありましたので確認をお願いいたします
~/.zprofile
とは、「~」というフォルダにある「.zprofile」という名前のファイル、という意味です
「~」とは、ユーザーのホームディレクトリ、すなわち「/Users/###/」のことです
つまり「/Users/###/」にある「.zprofile」という名前のファイルのことです
ただし、訂正があります
~/.zprofile
ではなく、
~/.zshrc
を修正してください
(新規作成ではなく、既存のファイルの修正)
https://prog-8.com/docs/python-env
を確認したら、「3. pyenvのインストール」の「実行結果が /bin/zsh の場合、以下4つのコマンドを実行してください。」のところで、
~/.zshrc
の末尾に追加してるので、今回もそのファイルの末尾に追加する方がいいと思います
【追記】.zshrcは隠しファイルなので、設定を変えないとファインダーに出てきません
下記を見て、ファインダーの設定を変えてください
https://support.borndigital.co.jp/hc/ja/articles/360005975154
まだ設定の変更ができていないため
私の作業の手順の確認をお願いいたします
先ほど案内いただいたWEBページの
PATH=
からの3行をコピーしvscodeにてファイルを作成したのちテキスト文の最初に~/.zshrcをつけました
現在そのファイルのなかは
~/.zshrcPATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"PATH="${HOME}/LibraryPython/3.8/bin:${PATH}"export PATH
このように記載されており、ファイルはデスクトップに保存しています
ファイル名はpyupと勝手につけています
その後ターミナルで
which python3
を実行すると
/Users/###/.pyenv/shims/python3
この様に応対があり、まだ設定の変更が済んでいないと判断しています
申し訳ないです、私のmac自体の知識不足により大変な勘違いを行っていたようです
~/.zshrcとうファイルがすでにこのmac内にあり
そのファイルの内容の変更が先ほどのPATH= から始まるコードの入力と言うことで間違えないでしょうか?
やはり、~/.zshrcは隠しコマンドだったようで
表示化すると確認できました
finderの私のユーザーアカウントにファイルは入っており
~/.zshrc のファイル内の末尾(下に)先ほどの修正を加えました
現在ターミナルにて
which python3
を実行すると
/Library/Frameworks/Python.framework/Versions/3.8/bin/python3
このように応答の変更が確認できました
現在、ターミナルにて上記のpip3のアップグレードとPillowのインストールを実施しました
pip3 list
を実行すると
(base) ###@###noMacBook-Pro ~ % pip3 list
Package Version
---------- -------
Pillow 8.1.0
pip 21.0.1
setuptools 49.2.1
このように出力され、無事pillowのインストールが確認できました
次いで本来の目的であるモジュールの実行も可能となりました
やはり私の場合はvscodeにて現行のバージョンに近いpython3系を使うのが目的であり、pyenvの利用は本来の目的とは異なる理由のため削除する方が良い判断でしょうか?
> ~/.zshrcとうファイルがすでにこのmac内にあり
そのファイルの内容の変更が先ほどのPATH= から始まるコードの入力と言うことで間違えないでしょうか?
合ってます
気になるのが、
> ~/.zshrcPATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"PATH="${HOME}/LibraryPython/3.8/bin:${PATH}"export PATH
と、一つの行につながって書かれていることです
実際の「.zshrc」に追記されたところは、ちゃんと三つの行に分かれてますか?
(「~/.zshrc」の部分は書いてないとして、それ以降の部分)
VS Codeで
which python3
を実行したり、下記のpythonコードを実行したりした結果は、idleと同じでしょうか?
import sys
import pprint
pprint.pprint(sys.path)
結果がidleと同じなら、公式版pythonを使えてるので、idle, VS Code, ターミナルの全てで公式版を使える状態になってます
そうであれば、pyenv版は混乱の元なので、削除した方がいいかもしれませんね
もし将来必要になったら、また入れたらいいだけなので
>>実際の「.zshrc」に追記されたところは、ちゃんと三つの行に分かれてますか?
ご心配をおかけしました、PATH= からの3行のコードは
紹介されたサイトからコピーし修正し、そのままの形で貼り付けています(ファイル ~/.zshrcのなかです)
>>>
VS Codeで
which python3
を実行したり、下記のpythonコードを実行したりした結果は、idleと同じでしょうか?
>>>
vscodeのターミナルとmacのターミナルの which pytho3の実行結果は同じでした
また記載いただいているコード(import sysなど)の実行結果もvscodeとIDLEで同じ結果を得ることができました
すいません次いで質問があるのですが
私はpyenvをインストールする際に、homebrewをインストールした後にpyenvをインストールしました
この場合は、pyenvだけのアンインストールで充分でしょうか?
特にpyenv以外でhomebrewを使っている覚えはありません
pyenvのアンインストールに関してはこちらのサイトを参考に実施しようと思います
https://qiita.com/Dyslexi4/items/6f659b51c96a71e2a978
homebrewは、残していてもいいのではないですかね
python以外にも何か入れることになるかもしれないし
わかりました、では後の処理はまた自分で解決していけるよう努力します
ここ数日間は貴重なお時間をお借りして大変お世話になりました
とても言葉だけでは感謝が伝えられませんが、私の不足する色々な課題も見つかりとても勉強になるものでした
私も他者の助けになるプログラマーになれるよう努めます。
回答2件
あなたの回答
tips
プレビュー