Mac Python シェルコマンド プログラミング

MacのAnacondaでPython3.8環境を作ってPygame2をインストールする

とりあえずやり方から

# pythonのバージョンを指定してpy38という名前の実行環境を作成。名前は何でもよい
conda create -n py38 python=3.8

# 環境を切り替え
conda activate py38

# pipでpygameをインストール
pip install pygame

AnacondaでPythonはじめました

よく使うJavascriptに加えてもうひとつプログラミング言語を覚えたいと思い、Pythonの勉強を再開しました(昔、ちょっとやって飽きた)。

Macには標準でPythonが入っていますが,調べるとどうやら自分でインストールしたほうが良いみたいです。

Pythonの環境構築の方法はいろいろあって選択に困ります。

とりあえずGoogleのColaboratoryは便利ですね。ブラウザ上でさくっとコードを書いてその場で試せる。何もインストールする必要がないのがいいです。

https://colab.research.google.com/

とはいえ、やはりローカル開発環境があったほうがいいので、色んなライブラリやツールが使えるらしいAnacondaを公式サイトからダウンロードしてインストールしました。

https://www.anaconda.com/

M1 Macにも問題無くインストールできました。

which python コマンドでパスを確認するとちゃんとAnacondaのpythonになっています。

pythonコマンドでREPL(対話的実行環境)を起動すると Python3.9.7、Anacondaと出ました。

(base) kimura@M1MBP2021 ~ % which python
/Users/kimura/opt/anaconda3/bin/python

(base) kimura@M1MBP2021 ~ % python

Python 3.9.7 (default, Sep 16 2021, 08:50:36) 
[Clang 10.0.0 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> quit()

AnacondaにPygameが入らない

積ん読になっていたPython教本の関係で、ゲーム用のライブラリPygameをインストールしようとしました。

Anacondaがインストールされた環境ではcondaコマンドでパッケージなどの管理などを行います。

パッケージのインストールコマンドはconda installです。

conda install pygame と入力しましたが、PackagesNotFoundError がでてしまいました。

(base) kimura@M1MBP2021 ~ % conda install pygame

Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.

PackagesNotFoundError: The following packages are not available from current channels:

  - pygame

Current channels:

  - https://repo.anaconda.com/pkgs/main/osx-64
  - https://repo.anaconda.com/pkgs/main/noarch
  - https://repo.anaconda.com/pkgs/r/osx-64
  - https://repo.anaconda.com/pkgs/r/noarch

To search for alternate channels that may provide the conda package you're
looking for, navigate to

    https://anaconda.org

and use the search bar at the top of the page.


調べてみるとconda installはあらかじめ設定されたチャンネル(ライブラリの共有場所?)からダウンロードするようです。

どうやらPygameのインストールはデフォルトのチャンネルではなく、別の場所を指定する必要があるみたいです。

conda install -c cogsci pygame というコマンドを使いました。

-c はダウンロードするチャンネルを指定するオプションです。

するとパッケージは見つかりましたが、pythonのバージョンがサポート外だと言われてしまいました。

(base) kimura@M1MBP2021 ~ % conda install -c cogsci pygame

Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: | 
Found conflicts! Looking for incompatible packages.
This can take several minutes.  Press CTRL-C to abort.
failed                                                                                                              

UnsatisfiableError: The following specifications were found
to be incompatible with the existing python installation in your environment:

Specifications:

  - pygame -> python[version='2.7.*|3.5.*']

Your python: python=3.9

If python is on the left-most side of the chain, that's the version you've asked for.
When python appears to the right, that indicates that the thing on the left is somehow
not available for the python version you are constrained to. Note that conda will not
change your python version to a different minor version unless you explicitly specify
that.

pygame -> python[version='2.7.|3.5.'] とあるので、Pyhonの2.7〜3.5がサポート対象とのこと。

なんか古くない?今のPythonはもう3.9なんですけど、というワケで調べました。

Pygameの公式サイト(https://www.pygame.org)は平和の鳩しか居なかったので、Github(https://github.com/pygame/pygame)へ行ってみました。しかしここでもどうもよく分かりません。

最終的にWikipediaのPygame記事が役に立ちました。

https://ja.wikipedia.org/wiki/Pygame

ここの記述(2022年3月現在)によると、

pygame 1.9.xは、Python 2.7と、Python 3.4からPython 3.7まで。
pygame 2は、Python 3.4からPython 3.8をサポートする。Python 2.7のサポートも当面継続。

https://ja.wikipedia.org/wiki/Pygame

バージョンはエラーメッセージと違いますが、とりあえずPygameにはバージョン1,xと2,xがあることが分かりました。

バージョン2.xならPython3.8でも使えるみたいです。

Anacondaでバージョンの違うPython環境を用意できる

いずれにせよPython3.9ではPygameが動かないので、旧バージョンのPythonを用意する必要があります。

こりゃインストールし直しかなぁと思ったら、なんとAnacondaはPythonの実行環境を複数作って切り替えられることが分かりました。

詳しい人には「今更かよ!」と言われそうですが、断片的な情報を頼りにやっている人間なんてそんなものです。

環境というとVirtualBoxのように通常のMac環境とは切り離されたイメージがありましたが、Anacondaの作る環境はPythonの実行に限ったものらしく、他のコマンドやアプリケーションは普通に動きます。

仮想環境と呼ばれることもあるみたいですが、実行環境と呼んだほうがしっくり来る気がします。

Anacondaの環境の管理はAnaconda-NavigatorというGUIアプリでもできますが、CUIの方が記録に残しやすいのでターミナルでやりました。

CUIで行った操作結果もGUIの方に反映されますし、逆もOKみたいです。

Anacondaの管理にはconda コマンドを使います。condaコマンドのリファレンスは以下にあります。

https://docs.conda.io/projects/conda/en/latest/commands.html

現在の実行環境を確認する conda info -e

現在、どんなPython仮想環境が作られているかをリストアップします。-eはリストを環境だけに限定するオプション。

conda info -e

(base) kimura@M1MBP2021 ~ % conda info -e
# conda environments:
#
base                  *  /Users/kimura/opt/anaconda3

最初はデフォルトのbase環境だけが表示されます。使っている環境に"*"がつきます。

コマンドプロンプトにいつのまにか(base)とくっついていて、ずっと何だろうと思っていたのですが、Anacondaの現在の環境を表していたのですね。

Pythonの実行環境を新しく作る conda create

conda createで環境を作ります。-n は環境名を指定するオプション、Pythonのバージョンも指定します。

pythonのバージョンが分かりやすいように環境名をpy38としました。こういう付け方でいいのかな。ひとりでやってるとこういう時の相場とか暗黙の了解みたいなものが分からないんですよね。

conda create -n py38 python=3.8

confa info -e で確認すると以下のようにpy38という環境が追加されました。

(base) kimura@M1MBP2021 ~ % conda info -e
# conda environments:
#
base                  *  /Users/kimura/opt/anaconda3
py38                     /Users/kimura/opt/anaconda3/envs/py38

あとから環境の名前を変えられるのかなと思って調べたら、conda自体にはrename機能はないみたいです。

代わりにクローンしてオリジナルを削除する方法が見つかりました。

Anaconda仮想環境の名前を変更する方法

conda create -n NEW_NAME --clone PREVIOUS_NAME
conda remove -n PREVIOUS_NAME --all

実行環境を切り替える conda activate (deactivate)

環境を切り替えるにはconda activateを使います。

conda activate py38

(base) kimura@M1MBP2021 ~ % conda activate py38
(py38) kimura@M1MBP2021 ~ % 

プロンプトの先頭が(base)から(py38)に変わりました。

環境をbaseに戻すには conda deactivateを使います。

conda deactivate

(py38) kimura@M1MBP2021 ~ % conda deactivate 
(base) kimura@M1MBP2021 ~ % 

プロンプトも(base)に戻りました。

baseの状態でconda deactivateを使うと、Anaconda環境から抜け出してMacのpython環境に入るみたいです。

以下のようにdeactivateすると(base)の表記が消え、whichで得られるpythonのパスも変わります。

(base) kimura@M1MBP2021 ~ % which python
/Users/kimura/opt/anaconda3/bin/python

(base) kimura@M1MBP2021 ~ % conda deactivate

kimura@M1MBP2021 ~ % which python
/usr/bin/python

環境を削除する

要らなくなった環境はconda removeで削除できます。

conda remove -n py38 --all

今の環境にインストールされているライブラリを一覧する

conda list でライブラリの一覧が見られます。

conda list

(py38) kimura@M1MBP2021 ~ % conda list
# packages in environment at /Users/kimura/opt/anaconda3/envs/py38:
#
# Name                    Version                   Build  Channel
ca-certificates           2022.2.1             hecd8cb5_0  
certifi                   2021.10.8        py38hecd8cb5_2  
libcxx                    12.0.0               h2f01273_0  
libffi                    3.3                  hb1e8313_2  
ncurses                   6.3                  hca72f7f_2  
openssl                   1.1.1m               hca72f7f_0  
pip                       21.2.4           py38hecd8cb5_0  
python                    3.8.12               h88f2d9e_0  
readline                  8.1.2                hca72f7f_1  
setuptools                58.0.4           py38hecd8cb5_0  
sqlite                    3.37.2               h707629a_0  
tk                        8.6.11               h7bc2e8c_0  
wheel                     0.37.1             pyhd3eb1b0_0  
xz                        5.2.5                h1de35cc_0  
zlib                      1.2.11               h4dc903c_4  

Anacondaで作ったPython3.8環境にPygame2をインストールする

いよいよPygameをインストールします。

しかし、conda install -c cogsci pygameでインストールしてもやはりエラーになってしまいました。

どうやらconda installはpygame1をインストールしようとするみたいです。

調べてみると、代わりに通常のpython環境と同様にpipコマンドを使うとよいことが分かりました。

pip install pygame でいいみたいです。

その前に pip install --upgrade pip でpip自身を更新したほうがいいかも。

Anaconda環境だからといって別にcondaコマンドしか使えないわけではないようです。

pip install pygame

(py38) kimura@M1MBP2021 ~ % pip install pygame
Collecting pygame
  Using cached pygame-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl (8.9 MB)
Installing collected packages: pygame
Successfully installed pygame-2.1.2

無事にPygame2がインストールできました!

サンプルゲームも動きました。

python -m pygame.examples.aliens

別途、python3.5の環境を作ってconda installでpygame1をインストールしてみました。上記のサンプルゲームはこの環境だと自機が武器を打ったときにアプリが落ちてしまいました。

パッケージのアンインストール

パッケージのアンインストールはconda uninstallとpip uninstallがあります。

conda uninstall pygameとやるとPackagesNotFoundErrorが出てしまいました。

pipでインストールしたものはpipでしかアンインストールできないようです。

pip uninstall pygame

(test) kimura@M1MBP2021 ~ % pip uninstall pygame
Found existing installation: pygame 2.1.2
Uninstalling pygame-2.1.2:
  Would remove:
    /Users/kimura/opt/anaconda3/envs/test/include/python3.8/pygame/_camera.h
    /Users/kimura/opt/anaconda3/envs/test/include/python3.8/pygame/_pygame.h
    /Users/kimura/opt/anaconda3/envs/test/include/python3.8/pygame/_surface.h
    /Users/kimura/opt/anaconda3/envs/test/include/python3.8/pygame/camera.h
    (中略)
    /Users/kimura/opt/anaconda3/envs/test/include/python3.8/pygame/pygame.h
    /Users/kimura/opt/anaconda3/envs/test/include/python3.8/pygame/scrap.h
    /Users/kimura/opt/anaconda3/envs/test/include/python3.8/pygame/surface.h
    /Users/kimura/opt/anaconda3/envs/test/lib/python3.8/site-packages/pygame-2.1.2.dist-info/*
    /Users/kimura/opt/anaconda3/envs/test/lib/python3.8/site-packages/pygame/*
Proceed (Y/n)? y
  Successfully uninstalled pygame-2.1.2

ライブラリや本体の更新

## 更新
conda update conda
conda update --all
conda update [library名]

pip install --upgrade pip
pip install --upgrade [library名]
もしくは
python3 -m pip install --upgrade pip

まとめ:python3.8環境を作ってpygame2をインストールする手順

まとめると3行の作業なんですが、ここにたどり着く過程というのも個人の記録としては大事だったりします。

# py38という名前の環境を作成
conda create -n py38 python=3.8

# 環境を切り替え
conda activate py38

# pygameをインストール
pip install pygame

いろいろ試行錯誤したおかげで、Anaconda環境というものがちょっと分かってきました。

-Mac, Python, シェルコマンド, プログラミング