Pythonお悩み解決

Pythonに関する疑問や悩みにこたえるブログです

辞書をマージ(結合)したい

Pythonで辞書をマージ(結合)する方法を紹介します。

いくつか方法があるので、それぞれ説明します。

演算子 | を使う

Python 3.9以降であれば、辞書をマージするのに演算子|が使えます。

>>> d1 = {'k1': 'v11', 'k2': 'v12'}
>>> d2 = {'k2': 'v22', 'k3': 'v23'}
>>> # 演算子 | を使ってマージ
>>> d1 | d2
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}
>>> d2 | d1
{'k2': 'v12', 'k3': 'v23', 'k1': 'v11'}

上記の様に、キー値が異なる要素(この場合は k1k3)はそのままマージされます。

また、同じキー値をもつ要素(この場合は k2)については | の後に書いた辞書の要素が優先されます。

なお、| を使っても元の辞書には影響がありません。

>>> # 元の辞書はそのまま
>>> d1
{'k1': 'v11', 'k2': 'v12'}
>>> d2
{'k2': 'v22', 'k3': 'v23'}

元の辞書を更新する演算子 |=

元の辞書を更新したい場合は、演算子|=を使います。

>>> # d1を上書きする
>>> d1 |= d2
>>> d1
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}

Python 3.9以降をお使いであれば、||=を使うのが良いでしょう。

辞書のアンパックを使う

辞書のアンパックを使う方法もあります。

>>> d1 = {'k1': 'v11', 'k2': 'v12'}
>>> d2 = {'k2': 'v22', 'k3': 'v23'}
>>> # アンパックを使ってマージ
>>> {**d1, **d2}
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}
>>> {**d2, **d1}
{'k2': 'v12', 'k3': 'v23', 'k1': 'v11'}

しかし、この方法は、あまり直感的ではありません。

パッと見ただけでは、2つの辞書をマージしていることが分かりにくいと思います。

update() メソッドを使う

辞書のupdate()メソッドを使う方法もあります。

>>> d1 = {'k1': 'v11', 'k2': 'v12'}
>>> d2 = {'k2': 'v22', 'k3': 'v23'}
>>> # update() メソッドを使ってマージ
>>> d1.update(d2)
>>> d1
{'k1': 'v11', 'k2': 'v22', 'k3': 'v23'}

しかし、update()メソッドは元の辞書を更新してしまうため、元の辞書を変更したくない場合には使えません。

まとめ

Pythonで辞書をマージする方法を紹介しました。

Python 3.9以降であれば、演算子 | |= を使う方法が良いでしょう。

文字列の前後から任意の文字を除去したい: stripメソッド(その2)

今回は文字列の前後から任意の文字を除去する方法を紹介します。

前後から任意の文字を除去する: strip()メソッド

文字列のstrip()メソッドを使うと、文字列の前後(先頭と末尾)から任意の文字を除去できます。

使い方は以下の通りです。

文字列.strip(除去する文字)

実際に使ってみましょう。

>>> s = '!!!こんにちは!!!'
>>> s.strip('!')
'こんにちは'

「こんにちは」の前後にはそれぞれ3つずつ!がありますが、それらが除去されたことを確認できました。

このように、文字列前後の連続する任意の文字がまとめて除去されます。

なお、このメソッドは指定した文字を除去した新しい文字列を返すため、元の文字列sはそのままです。

>>> # 元の文字列は変更されない
>>> s
'!!!こんにちは!!!'
複数の種類の文字を除去する

1つの文字だけでなく、複数の種類の文字の指定もできます。

たとえば!?を除去したい場合は、次のようにstrip('!?')とします。

>>> s = '!!!こんにちは???'
>>> s.strip('!?')
'こんにちは'

文字列の前後にある!?が除去されました。

strip()メソッドは前後の文字を除去しましたが、先頭部分の文字のみ除去したい場合や、末尾部分の文字を除去したい場合もあります。

これにはlstrip()メソッドやrstrip()メソッドが使えます。

先頭から任意の文字を除去する: lstrip()メソッド

文字列の先頭部分から任意の文字を除去したい場合lstrip()メソッドが使えます。

これは以下のように、先頭部分から指定した文字を除去した文字列を返します。

>>> s = '!?!こんにちは?!?'
>>> s.lstrip('!?')
'こんにちは?!?'

末尾から任意の文字を除去する: rstrip()メソッド

文字列の末尾部分から任意の文字を除去したい場合rstrip()メソッドが使えます。

これは以下のように、末尾部分から指定した文字を除去した文字列を返します。

>>> s = '!?!こんにちは?!?'
>>> s.rstrip('!?')
'!?!こんにちは'

なお、lstrip()lleft(左)、rstrip()rright(右)と考えれば覚えやすいです。

空白文字を除去する

これらのメソッドに引数を指定しなかった場合は、空白文字が除去対象となります。

これについてはこちらの記事で解説しています。

python-onayami.com

まとめ

  • 前後から任意の文字を除去するには strip()メソッドを使う
  • 先頭から任意の文字を除去するには lstrip()メソッドを使う
  • 末尾から任意の文字を除去するには rstrip()メソッドを使う

参考

文字列の前後の空白文字を除去したい: stripメソッド

今回は文字列の前後の空白文字を除去する方法を紹介します。

前後の空白文字を除去する: strip()メソッド

文字列のstrip()メソッドを使うと、文字列の前後(先頭と末尾)の空白文字を除去できます。

使い方は以下の通りです。

文字列.strip()

実際に使ってみましょう。

>>> s = '   こんにちは   '
>>> s.strip()
'こんにちは'

「こんにちは」の前後にはそれぞれ3つずつ半角スペースがありますが、それらが除去されたことを確認できました。

このように、文字列前後の連続する空白文字がまとめて除去されます。

なお、このメソッドは空白文字を除去した新しい文字列を返すため、元の文字列sはそのままです。

>>> # 元の文字列は変更されない
>>> s
'   こんにちは   '

strip()メソッドは前後の空白文字を除去しましたが、文字列の先頭部分の空白文字のみ除去したい場合や、末尾部分の空白文字を除去したい場合もあります。

これにはlstrip()メソッドやrstrip()メソッドが使えます。

先頭の空白文字を除去する: lstrip()メソッド

文字列の先頭部分の空白文字のみ除去したい場合lstrip()メソッドが使えます。

これは以下のように、先頭部分の空白文字のみ除去した文字列を返します。

>>> s.lstrip()
'こんにちは   '

末尾の空白文字を除去する: rstrip()メソッド

文字列の末尾部分の空白文字のみ除去したい場合rstrip()メソッドが使えます。

これは以下のように、末尾部分の空白文字のみ除去した文字列を返します。

>>> s.rstrip()
'   こんにちは'

なお、lstrip()lleft(左)、rstrip()rright(右)と考えれば覚えやすいです。

除去対象の空白文字

除去対象の空白文字は半角スペースだけではなく、改行文字やタブ文字も含まれます。

そのため、以下のようにrstrip()メソッドで末尾の改行文字を除去できます。

>>> # 改行文字を含む文字列
>>> s2 = 'こんにちは\n'
>>> s2.rstrip()
'こんにちは'

これはたとえばopen()関数でテキストファイルを開き、for文で1行ずつ処理する場合、strip()rstrip()を使って末尾の改行文字を除去するのに使えます。

with open("sample.txt") as f:
    for line in f:
        # 末尾の改行文字を除去
        line = line.rstrip()
        ...

まとめ

  • 前後の空白文字を除去するには strip()メソッドを使う
  • 先頭の空白文字を除去するには lstrip()メソッドを使う
  • 末尾の空白文字を除去するには rstrip()メソッドを使う
  • 空白文字には改行文字やタブ文字も含まれる

参考

文字列を区切り文字で結合したい: joinメソッド

今回は文字列を区切り文字で結合する方法を紹介します。

join()メソッド

例として、以下のように,で区切られている文字列を考えてみましょう。

a,b,c

文字列を区切り文字で結合するには、文字列のjoin()メソッドを使います。

基本的な使い方は下記の通りです。

区切り文字.join(イテラブル)

イテラブル(iterable)とは、リストのように要素を一度に1つずつ返せるオブジェクトのことです。

結果は、各要素を区切り文字で結合した文字列になります。

実際に使ってみましょう。

>>> ",".join(["a", "b", "c"])
'a,b,c'

今回の場合、区切り文字は,なので、",".join(...)としています。

結果は、各要素を区切り文字で結合した文字列 'a,b,c' となりました。

イテラブルが文字列以外の要素を返す場合

join()メソッドのイテラブルが、文字列以外の要素を返す場合、エラーとなります。

例えば、以下のように文字列と数値が混在するリストをjoin()メソッドに渡してみましょう。

>>> "-".join(["03", 1234, "5678"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 1: expected str instance, int found

TypeErrorになりました。エラーメッセージにexpected str instance, int foundとあるように、文字列(str)を期待したところに数値(int)があったためです。

以下のように、リストの要素がすべて文字列であれば、期待通りに動作します。

>>> "-".join(["03", "1234", "5678"])
'03-1234-5678'

まとめ

  • 文字列を区切り文字で結合するには、文字列のjoin()メソッドを使う
  • イテラブル(リストなど)が文字列以外の要素を返すと、エラー(TypeError)になる

参考

関連記事

python-onayami.com

文字列を区切り文字で分割したい: splitメソッド

今回は文字列を区切り文字で分割する方法を紹介します。

split()メソッド

例として、以下のように,で区切られている文字列を考えてみましょう。

a,b,c

文字列を区切り文字で分割するには、文字列のsplit()メソッドを使います。

基本的な使い方は下記の通りです。

文字列.split(区切り文字)

結果は、区切り文字で分割された文字列のリストになります。

なお、「区切り文字」は「デリミタ(delimiter)」とも呼ばれます。

実際に使ってみましょう。

>>> "a,b,c".split(",")
['a', 'b', 'c']

今回の場合、区切り文字は,なので、split(",")としています。

結果は、区切り文字で分割された文字列のリスト['a', 'b', 'c']となりました。

区切り文字を指定しなかった場合

区切り文字を指定しなかった場合、以下のように連続する空白文字がひとつの区切り文字とみなされます。

>>> "a b  c   d".split()
['a', 'b', 'c', 'd']

まとめ

  • 文字列を区切り文字で分割するには、文字列のsplit()メソッドを使う
  • 結果は、区切り文字で分割された文字列のリストになる

参考

パッケージ管理の方法を知りたい(pipの基本的な使い方)

Pythonは標準ライブラリ以外にも、数多くのサードパーティ製のパッケージがあり、PyPI(ぱいぴーあい)というリポジトリにて公開されています。

Pythonサードパーティ製パッケージをインストールするには、pipというツールを使います。

今回はpipの基本的な使い方を解説しましょう。

pipのインストール

pipPythonをインストールすれば同時にインストールされるので、すぐに使えます*1

もしインストールされていない場合は、以下のようにensurepipモジュールを使うことでpipをインストールできます。

python -m ensurepip

なお、Debian/Ubuntuに標準でインストールされているPythonにはensurepipモジュールが存在しません。そのため、代わりにaptコマンドでpython3-pipというパッケージをインストールしてください。

sudo apt install -y python3-pip

pipを使うときの注意点

pipはデフォルトではシステム全体で使える領域にパッケージをインストールしてしまいます。

各プロジェクト毎に必要なパッケージはそれぞれ異なるので、システム全体にインストールするのはお勧めしません。

パッケージをインストールする場合は、基本的に仮想環境を使うのがよいでしょう。

以降は、Pythonの仮想環境が有効になっていることを前提に説明します。

仮想環境について詳しくない方は、こちらの記事をご参照ください。

python-onayami.com

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

PyPIからパッケージをインストールするには、installコマンドを使います。

pip install <パッケージ名>

指定した「パッケージ名」がPyPIに公開されていれば、そのパッケージがインストールされます。

試しにWebフレームワークであるDjangoをインストールしてみます。

(venv) $ pip install Django
Collecting Django
  Downloading Django-4.1-py3-none-any.whl (8.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.1/8.1 MB 27.8 MB/s eta 0:00:00
Collecting sqlparse>=0.2.2
  Downloading sqlparse-0.4.2-py3-none-any.whl (42 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 42.3/42.3 kB 52.8 MB/s eta 0:00:00
Collecting asgiref<4,>=3.5.2
  Downloading asgiref-3.5.2-py3-none-any.whl (22 kB)
Installing collected packages: sqlparse, asgiref, Django
Successfully installed Django-4.1 asgiref-3.5.2 sqlparse-0.4.2

この記事を執筆した時点で最新のDjango 4.1がインストールされました。また、依存パッケージがあれば合わせてインストールされます。

バージョンを指定してインストール

installコマンドは、デフォルトではそのパッケージの最新版をインストールします。

しかし、バージョンを指定したいこともあるでしょう。その場合は、以下のようにバージョンを指定してインストールできます。

pip install <パッケージ名>==<バージョン>

試しにDjango 4.0をインストールしてみます。

(venv) $ pip install Django==4.0
Collecting Django==4.0
  Using cached Django-4.0-py3-none-any.whl (8.0 MB)
Requirement already satisfied: sqlparse>=0.2.2 in ./venv/lib/python3.10/site-packages (from Django==4.0) (0.4.2)
Requirement already satisfied: asgiref<4,>=3.4.1 in ./venv/lib/python3.10/site-packages (from Django==4.0) (3.5.2)
Installing collected packages: Django
  Attempting uninstall: Django
    Found existing installation: Django 4.1
    Uninstalling Django-4.1:
      Successfully uninstalled Django-4.1
Successfully installed Django-4.0

Djangoのバージョンが4.0にダウングレードされました。

インストールしたパッケージの確認

インストールしたパッケージを確認するには、listコマンドを使います。

pip list

現在インストールされているパッケージを確認してみましょう。

(venv) $ pip list
$ pip list
Package    Version
---------- -------
asgiref    3.5.2
Django     4.0
pip        22.2.2
setuptools 65.0.2
sqlparse   0.4.2

インストールしたパッケージと、それぞれのバージョンが表示されました。

先ほどインストールしたDjango 4.0が確認できます。

なお、asgirefsqlparseDjangoの依存パッケージです。また、pipsetuptoolsはデフォルトでインストールされています。

古いパッケージの確認

開発を続けていると、パッケージ側のバージョンが上がり、プロジェクトで使用しているパッケージが古くなることがあります。

どのパッケージが古くなっているかを確認したい場合は、以下のコマンドを使います(もしくは pip list --outdated)。

pip list -o

実際に使ってみましょう。

(venv) $ pip list -o
Package Version Latest Type
------- ------- ------ -----
Django  4.0     4.1    wheel

先ほどDjangoを4.0にダウングレードしたので、最新版(Latest)であるDjango 4.1の存在が確認できます。

パッケージのアップグレード

インストール済みのパッケージを最新バージョンにするには以下のコマンドです(もしくは pip install --upgrade <パッケージ名>)。

pip install -U <パッケージ名>

ダウングレードしたDjangoを再び最新バージョンにしてみましょう。

(venv) $ pip install -U Django
Requirement already satisfied: Django in ./venv/lib/python3.10/site-packages (4.0)
Collecting Django
  Using cached Django-4.1-py3-none-any.whl (8.1 MB)
Requirement already satisfied: sqlparse>=0.2.2 in ./venv/lib/python3.10/site-packages (from Django) (0.4.2)
Requirement already satisfied: asgiref<4,>=3.5.2 in ./venv/lib/python3.10/site-packages (from Django) (3.5.2)
Installing collected packages: Django
  Attempting uninstall: Django
    Found existing installation: Django 4.0
    Uninstalling Django-4.0:
      Successfully uninstalled Django-4.0
Successfully installed Django-4.1

執筆時点での最新バージョン(4.1)に更新されました。

複数の環境間でパッケージのインストール状態を統一する

以下のコマンドで、現在インストールしているパッケージを、インストール可能なフォーマットで出力できます。

pip freeze

実際に使ってみましょう。

(venv) $ pip freeze
asgiref==3.5.2
Django==4.1
sqlparse==0.4.2

インストール済みのパッケージとバージョンが、インストール可能な形式で一覧表示されました。

これを保存して共有すれば、複数の環境間でパッケージのインストール状態を統一するのに便利です。

保存するファイル名は任意ですが、「requirements.txt」という名前がよく使われます。

(vevn) $ pip freeze > requirements.txt

保存した「requirements.txt」を使って、一括でパッケージをインストールするには以下のようにします。

(vevn) $ pip install -r requirements.txt

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

最後にパッケージをアンインストールする方法です。以下のコマンドでパッケージをアンインストールできます。

pip uninstall <パッケージ名>

Djangoをアンインストールしてみます。途中でアンインストールするか確認されるので、「Y」を入力すればアンインストールできます。

(venv) $ pip uninstall Django
Found existing installation: Django 4.1
Uninstalling Django-4.1:
  Would remove:
    /Users/test/blog/venv/bin/django-admin
    /Users/test/blog/venv/lib/python3.10/site-packages/Django-4.1.dist-info/*
    /Users/test/blog/venv/lib/python3.10/site-packages/django/*
Proceed (Y/n)? Y
  Successfully uninstalled Django-4.1

Djangoがアンインストールされました。

ただし、以下の通りDjangoインストール時に合わせてインストールされた依存パッケージはアンインストールされていないので、注意しましょう。

(venv) $ pip list
Package    Version
---------- -------
asgiref    3.5.2
pip        22.2.2
setuptools 65.0.2
sqlparse   0.4.2

まとめ

pipには他にも機能がありますが、よく使う基本的なコマンドを紹介しました。

最後に今回紹介したコマンドをまとめます。

# パッケージのインストール
pip install <パッケージ名>

# バージョンを指定してパッケージのインストール
pip install <パッケージ名>==<バージョン>

# パッケージのバージョンアップ
pip install -U <パッケージ名>

# パッケージのアンインストール
pip uninstall <パッケージ名>

# インストール済みのパッケージの確認
pip list

# 古いパッケージの確認
pip list -o

# インストール済みのパッケージをrequirements.txtに保存
pip freeze > requirements.txt

# requirements.txtを使ってパッケージをインストール
pip install -r requirements.txt

*1:Python 3.4以降

仮想環境の使い方を知りたい(venvの基本)

Pythonで実際の開発する場合、以下のようなことをしたいと考えるでしょう。

  • プロジェクト毎にパッケージを管理したい
  • プロジェクト毎にPythonのバージョンを指定したい

Pythonでは仮想環境という仕組みを使って、これを実現できます。

今回はPython仮想環境と、仮想環境を扱うvenvの基本的な使い方について解説します。

Pythonの仮想環境とは

Pythonの仮想環境とは、独立したPython環境のことです。

「独立した」とは、その仮想環境の中にインストールされたPythonインタープリタやパッケージが、他の仮想環境にインストールされたものから隔離されている、ということです。

さらに、仮想環境はシステム(OS)のPython環境にインストールされたパッケージからも隔離されています。

そのため仮想環境を使うことで、プロジェクト毎にパッケージを管理したり、Pythonのバージョンを指定できるようになります。

仮想環境を使うには、Pythonに標準でインストールされているvenvを利用します。

venvの基本的な使い方

venvは標準ライブラリに含まれるモジュール*1なので、Pythonをインストールすればすぐに使えます。

仮想環境の作成

まずは、venvを使って仮想環境を作成します。作成方法は、コマンドプロンプトWindowsの場合)やターミナル(macOSの場合)で以下のようなコマンドを実行します。

python -m venv <仮想環境のパス>

macOSなどの場合は、pythonコマンドではなくpython3コマンドです(pythonだとPython 2.7が使われる可能性があります)。

python3 -m venv <仮想環境のパス>

-m venvでvenvモジュールを、<仮想環境のパス>でvenvモジュールに渡す引数を指定しています。

<仮想環境のパス>は任意ですが、venvenvなどが使われることが多いです。ここではsample-venvとし、任意の空ディレクトリ下で実行してみます。

python3 -v venv sample-venv

すると、sample-venvというディレクトリ(フォルダ)が作成されます。なお、このディレクトリの名前は、仮想環境の作成時に指定した<仮想環境のパス>になります。

このディレクトリの内容を、少し確認してみましょう。内容は環境によって多少異なります。

sample-venv/
├── bin/
├── include/
├── lib/
└── pyvenv.cfg

このように、仮想環境の実体はPython実行ファイルなど幾つかのファイルを含んだディレクトリです。

便利なオプション

仮想環境を作成すると、仮想環境にはpipなどがインストールされた状態になっていますが、バージョンが古いことがあります。

仮想環境を有効化後、以下のコマンドでpipを最新化できますが、少々面倒です。

pip install --upgrade pip

これについて、Python 3.9からは--upgrade-depsというオプションが追加されました。

このオプションをつけて仮想環境を作成すると、pipなどが最新化された状態で仮想環境が作成されます。

python -m venv --upgrade-dep <仮想環境のパス>

仮想環境の有効化

仮想環境を作成しただけでは、まだ仮想環境を利用している状態にはなっていません。

作成した仮想環境を使うには、仮想環境を有効化する必要があります。

環境やお使いのシェルによって、実行するスクリプトが異なります。

Windowsの場合(コマンドプロンプト

sample-venv¥Scripts¥activate.bat

macOS/Linuxの場合(bash/zsh

source sample-venv/bin/activate

上記のsample-venvの部分はそれぞれの<仮想環境のパス>で置き換えてください。

以降はmacOSを使って解説します。

仮想環境が有効化されると、以下のように、プロンプトに利用中の仮想環境がつきます((sample-venv)の部分です)。

$ source sample-venv/bin/activate
(sample-venv) $ 

ためしにpythonコマンドのバージョンやパスを確認すると、仮想環境の有効化後は仮想環境内のpythonが使われるようになっています。

# 仮想環境が有効な状態
(sample-venv) $ python -V
Python 3.10.6
(sample-venv) $ which python
/Users/testuser/venv-sample/venv/bin/python
# 仮想環境が無効な状態
$ python -V
Python 2.7.13
$ which python
/usr/local/bin/python
注意点

仮想環境を有効化しても、それはそのコマンドプロントやターミナルに限られます。システム全体のPython環境が仮想環境になるわけではありません。

そのため、新たにコマンドプロントやターミナルを立ち上げた場合、その中では仮想環境は有効になっていません。

複数のコマンドプロントやターミナルで仮想環境を使いたい場合は、それぞれの中で有効化する必要があります。

仮想環境の無効化

仮想環境の利用を停止する場合は、仮想環境を無効化します。

無効化するためのコマンドはdeactivateです。

このコマンドは仮想環境を有効化した時に、利用できるようになっています。

(sample-venv) $ deactivate
$ 

プロンプトに付いていた(sample-venv)が無くなりました。これで仮想環境が無効化されたことになります。

仮想環境の削除

仮想環境を削除するには、仮想環境のディレクトリを削除するだけで大丈夫です。

特別なコマンドなどはありません。

仮想環境ごとにPythonのバージョンを分ける方法

仮想環境におけるPythonのバージョンは、仮想環境の作成に使用したPythonのバージョンになります。

そのため、たとえばPython 3.9で仮想環境を作成したら、仮想環境のPythonのバージョンも3.9になります。

試しにPython 3.9で仮想環境を作成し、有効化してみます。macOSではpython3.9のようにバージョンを付けたコマンドが実行できます。*2

$ python3.9 -m venv venv39

Windowsの場合は、インストールしたPythonのフルパスを指定します。*3

>C:\Users\testuser\AppData\Local\Programs\Python\Python39\python -m venv venv

仮想環境を有効化し、pythonのバージョンを確認してみます。

$ source venv39/bin/activate
(venv39) $ python -V
Python 3.9.12

先ほどの仮想環境(sample-venv)はPython 3.10でしたが、今回の仮想環境(venv39)はPython 3.9になっていることが確認できました。

このように、仮想環境ごとにPythonのバージョンを指定できます。

なお、パッケージ管理の方法については、また別の記事で解説したいと思います。

まとめ

  • Pythonの仮想環境は、独立したPython環境
  • 仮想環境を使うと、プロジェクトごとにパッケージ管理したり、Pythonのバージョンを指定できる
  • 仮想環境の作成にはvenvを使う
  • 仮想環境を使うには、仮想環境を有効化する必要がある

参考

*1:Python 3.3から標準ライブラリに追加されました

*2:もちろん対応するPythonがインストールされている必要があります

*3:Microsoft Storeからインストールした場合は、python3.9などバージョン付きのコマンドが使えます