前の記事では、nohup や tmux を使って、ターミナルを閉じても処理を止めない方法を見ました。そこで動かしたいものとして、いちばん多いのが Python のスクリプトだと思います。
私が Linux で Python を使い始めたとき、ネットの手順どおりに pip install と打ったら、英語の長いエラーが出て止まってしまいました。「Windows では動いたのに、なぜ?」と、しばらく悩みました。今の Debian や Ubuntu では、パソコン全体の Python に、pip で直接ライブラリを入れられないようになっているんです。
この記事では、apt で Python の道具を入れ、venv(仮想環境)というプロジェクト専用の部屋を作って、その中で pip を使う手順を、順番に確かめていきます。
- Linux に入っている Python の確かめ方
- apt で
python3-venvとpython3-pipを入れる方法 - 「externally-managed-environment」エラーの意味
- venv の作り方・入り方(activate)・出方(deactivate)
- venv の中で
pip installして、requirements.txtに残す方法 - venv に入らずに、venv の Python を直接動かす方法
-
sudo apt installでソフトを入れられる - PATH と
whichのしくみがわかる -
>で出力をファイルに保存できる
まだの方は、前の記事「Linuxでログアウトしても処理を止めない|&・nohup・tmuxの使い方【初心者向け】」と、Lv3 の最初の記事「Linuxの環境変数とPATH|「command not found」の正体と.bashrc・alias」から読むのがおすすめです。
- ログインシェル:ログインしたときに最初に動くシェル。設定ファイル
~/.profile(Debian・Ubuntu の場合)を読みます - tmux:ターミナルの作業画面を残したまま切りはなし、あとでまた戻れる道具
- apt:Debian・Ubuntu で、ソフトを入れる・更新する・消すための道具
- PATH:コマンドの本体を探しにいくディレクトリを
:(コロン)で区切って並べた環境変数。左から順に探します
用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。
結論:Python 本体は apt、ライブラリは venv の中の pip
| やること | コマンド |
|---|---|
| Python の道具を入れる | sudo apt install python3-venv python3-pip |
| venv を作る | python3 -m venv venv |
| venv に入る | source venv/bin/activate |
| ライブラリを入れる(venv の中で) | pip install requests |
| 入れたものを記録する | pip freeze > requirements.txt |
| venv から出る | deactivate |
| 入らずに venv の Python で動かす | venv/bin/python hello.py |
準備:練習用のディレクトリを作る
練習は ~/linux-practice/python-test の中で行います。
- 1
- 2
- 3
mkdir -p ~/linux-practice/python-test
cd ~/linux-practice/python-test
pwdここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。
(例)
- 1
- 2
kaito@demo:~/linux-practice/python-test$ pwd
/home/kaito/linux-practice/python-test入っている Python を確かめる
Debian や Ubuntu には、多くの場合、最初から python3 が入っています。
- 1
- 2
- 3
python3 --version
which python3
python --version(例)
- 1
- 2
- 3
- 4
- 5
- 6
kaito@demo:~/linux-practice/python-test$ python3 --version
Python 3.13.5
kaito@demo:~/linux-practice/python-test$ which python3
/usr/bin/python3
kaito@demo:~/linux-practice/python-test$ python --version
-bash: python: command not foundDebian 13 では、python3 は入っていて、python は「command not found」でした(先頭の -bash: は、ログインシェルで動いているときの表示です)。
Linux では、コマンドの名前は python ではなく python3 が基本です。python が「command not found」になっても、あわてなくて大丈夫です。
apt で venv と pip を入れる
venv と pip は、別のパッケージ(=ソフトをインストールしやすいように、ひとまとめにしたもの)になっていることが多いです。まず確かめてみます。
- 1
- 2
pip3 --version
python3 -m venv --help | head -3(例)
- 1
- 2
- 3
- 4
- 5
- 6
kaito@demo:~/linux-practice/python-test$ pip3 --version
-bash: pip3: command not found
kaito@demo:~/linux-practice/python-test$ python3 -m venv --help | head -3
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
[--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps]
[--without-scm-ignore-files]Debian 13 では、pip3 は入っていませんでした。python3 -m venv --help は、python3-venv を入れる前でも使い方が表示されました。ただし、実際に venv を作るには python3-venv が必要です(入っていないと、作るときに ensurepip がないという案内が出ることがあります)。どちらも次の apt でまとめて入れておきましょう。
入っていなければ、apt で入れます。
- 1
- 2
- 3
sudo apt update
sudo apt install python3-venv python3-pip
pip3 --version(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
kaito@demo:~/linux-practice/python-test$ sudo apt update
[sudo] password for kaito:
Get:1 http://deb.debian.org/debian trixie InRelease [140 kB]
Get:2 http://deb.debian.org/debian trixie-updates InRelease [47.3 kB]
Get:3 http://deb.debian.org/debian-security trixie-security InRelease [43.4 kB]
Fetched 231 kB in 0s (4060 kB/s)
All packages are up to date.
kaito@demo:~/linux-practice/python-test$ sudo apt install python3-venv python3-pip
Installing:
python3-pip python3-venv
Installing dependencies:
javascript-common libjs-underscore python3-dev python3-wheel
libexpat1-dev libpython3-dev python3-packaging python3.13-dev
libjs-jquery libpython3.13 python3-pip-whl python3.13-venv
libjs-sphinxdoc libpython3.13-dev python3-setuptools-whl zlib1g-dev
Suggested packages:
apache2 | lighttpd | httpd python3-setuptools
Summary:
Upgrading: 0, Installing: 18, Removing: 0, Not Upgrading: 0
Download size: 184 kB / 13.9 MB
Space needed: 53.0 MB / 109 GB available
Continue? [Y/n] Y
…(途中省略)…
Processing triggers for man-db (2.13.1-1) ...
Processing triggers for libc-bin (2.41-12+deb13u4) ...
kaito@demo:~/linux-practice/python-test$ pip3 --version
pip 25.1.1 from /usr/lib/python3/dist-packages/pip (python 3.13)[sudo] password for kaito: では自分のパスワードを打ちます(画面には出ません)。Continue? [Y/n] には Y と答えます。Debian 13 では、関係するものもあわせて18個のパッケージが入りました。
venv の外で pip install するとどうなるか
ためしに、venv を作らずに、そのまま pip install してみます。
- 1
pip3 install requests(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
kaito@demo:~/linux-practice/python-test$ pip3 install requests
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.
If you wish to install a non-Debian packaged Python application,
it may be easiest to use pipx install xyz, which will manage a
virtual environment for you. Make sure you have pipx installed.
See /usr/share/doc/python3.13/README.venv for more information.
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.長いですが、大事なのは最初の error: externally-managed-environment と、「apt install python3-xyz を使うか、python3 -m venv で仮想環境(venv)を作ってね」という案内の部分です。
このエラーは「パソコン全体の Python は apt が管理しているので、pip で直接さわらないでください」という意味です。壊れたわけではありません。apt が使っている Python のライブラリを pip で上書きすると、システムの道具が動かなくなることがあるので、それを防いでくれているんです。
ネットで調べると、pip install --break-system-packages や sudo pip install で、このエラーを無理やり通す方法が出てきます。名前のとおり「システムのパッケージを壊すかもしれない」書き方で、apt で入れた道具が動かなくなったり、あとで apt の更新が失敗したりする原因になります。また、sudo apt remove python3 のように Python 本体を消すと、システムの多くの道具が一緒に消えてしまいます。この記事では試しません。ライブラリは、このあと作る venv の中に入れましょう。
venv を作って、中に入る
プロジェクト用の venv を作ります。最後の venv は、作る小部屋(フォルダ)の名前です。
- 1
- 2
- 3
- 4
cd ~/linux-practice/python-test
python3 -m venv venv
ls
ls venv/bin | head(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
kaito@demo:~/linux-practice/python-test$ cd ~/linux-practice/python-test
kaito@demo:~/linux-practice/python-test$ python3 -m venv venv
kaito@demo:~/linux-practice/python-test$ ls
venv
kaito@demo:~/linux-practice/python-test$ ls venv/bin | head
Activate.ps1
activate
activate.csh
activate.fish
pip
pip3
pip3.13
python
python3
python3.13source で、venv に入ります。
- 1
- 2
- 3
- 4
source venv/bin/activate
which python
which pip
python --version(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
kaito@demo:~/linux-practice/python-test$ source venv/bin/activate
(venv) kaito@demo:~/linux-practice/python-test$ which python
/home/kaito/linux-practice/python-test/venv/bin/python
(venv) kaito@demo:~/linux-practice/python-test$ which pip
/home/kaito/linux-practice/python-test/venv/bin/pip
(venv) kaito@demo:~/linux-practice/python-test$ python --version
Python 3.13.5プロンプトの先頭に (venv) がついたら、venv の中に入っています。activate は、PATH の先頭に venv/bin を足しています。Lv3 の最初の記事で、自分のコマンド置き場を PATH に足したのと同じしくみです。venv の中では、python や pip と打つだけで、この小部屋のものが使われます。
venv の中で pip install する
今度はエラーにならないはずです。
- 1
- 2
- 3
pip install requests
pip list
python -c "import requests; print(requests.__version__)"(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
(venv) kaito@demo:~/linux-practice/python-test$ pip install requests
Collecting requests
Downloading requests-2.34.2-py3-none-any.whl.metadata (4.8 kB)
Collecting charset_normalizer<4,>=2 (from requests)
Downloading charset_normalizer-3.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (46 kB)
Collecting idna<4,>=2.5 (from requests)
Downloading idna-3.20-py3-none-any.whl.metadata (7.2 kB)
Collecting urllib3<3,>=1.26 (from requests)
Downloading urllib3-2.8.0-py3-none-any.whl.metadata (7.4 kB)
Collecting certifi>=2023.5.7 (from requests)
Downloading certifi-2026.10.23-py3-none-any.whl.metadata (2.5 kB)
Downloading requests-2.34.2-py3-none-any.whl (73 kB)
Downloading charset_normalizer-3.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (254 kB)
Downloading idna-3.20-py3-none-any.whl (69 kB)
Downloading urllib3-2.8.0-py3-none-any.whl (135 kB)
Downloading certifi-2026.10.23-py3-none-any.whl (135 kB)
Installing collected packages: urllib3, idna, charset_normalizer, certifi, requests
Successfully installed certifi-2026.10.23 charset_normalizer-3.5.2 idna-3.20 requests-2.34.2 urllib3-2.8.0
(venv) kaito@demo:~/linux-practice/python-test$ pip list
Package Version
------------------ ----------
certifi 2026.10.23
charset-normalizer 3.5.2
idna 3.20
pip 25.1.1
requests 2.34.2
urllib3 2.8.0
(venv) kaito@demo:~/linux-practice/python-test$ python -c "import requests; print(requests.__version__)"
2.34.2入れたものを requirements.txt に残す
入れたライブラリの名前とバージョンは、pip freeze でファイルに残しておけます。別のパソコンやサーバーで同じ環境を作るときに使います。
- 1
- 2
pip freeze > requirements.txt
cat requirements.txt(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
(venv) kaito@demo:~/linux-practice/python-test$ pip freeze > requirements.txt
(venv) kaito@demo:~/linux-practice/python-test$ cat requirements.txt
certifi==2026.10.23
charset-normalizer==3.5.2
idna==3.20
requests==2.34.2
urllib3==2.8.0この5行が、「この venv を作り直すためのメモ」です。requests しか入れていないのに5行あるのは、requests が動くのに必要なライブラリも、一緒に入ったからです。
requirements.txt から作り直すには
別のパソコンやサーバーで同じ環境を作るとき(または venv を消してしまったとき)は、requirements.txt を持っていけば、次の順番で作り直せます。
-
requirements.txtがあるフォルダで、python3 -m venv venvと打って、新しい venv を作る -
source venv/bin/activateで venv に入る -
pip install -r requirements.txtと打つ(-rは「このファイルに書かれたものを全部入れる」という意味)
これで、ファイルに書かれたのと同じバージョンのライブラリが入ります。venv に入らずに venv/bin/pip install -r requirements.txt と打っても、同じように venv の中に入ります。
実際に、いまの venv をまるごと消して、requirements.txt から作り直してみます(この例は、このあとの「練習用のスクリプトを動かす」で hello.py を作ったあとに試したものです。rm -r venv は、ls venv で venv のフォルダだと確かめてから打ちます)。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
deactivate
ls venv
rm -r venv
ls
python3 -m venv venv
source venv/bin/activate
pip list
pip install -r requirements.txt
pip list
python hello.py(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
(venv) kaito@demo:~/linux-practice/python-test$ deactivate
kaito@demo:~/linux-practice/python-test$ ls venv
bin include lib lib64 pyvenv.cfg
kaito@demo:~/linux-practice/python-test$ rm -r venv
kaito@demo:~/linux-practice/python-test$ ls
hello.py requirements.txt
kaito@demo:~/linux-practice/python-test$ python3 -m venv venv
kaito@demo:~/linux-practice/python-test$ source venv/bin/activate
(venv) kaito@demo:~/linux-practice/python-test$ pip list
Package Version
------- -------
pip 25.1.1
(venv) kaito@demo:~/linux-practice/python-test$ pip install -r requirements.txt
Collecting certifi==2026.10.23 (from -r requirements.txt (line 1))
Using cached certifi-2026.10.23-py3-none-any.whl.metadata (2.5 kB)
Collecting charset-normalizer==3.5.2 (from -r requirements.txt (line 2))
Using cached charset_normalizer-3.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (46 kB)
Collecting idna==3.20 (from -r requirements.txt (line 3))
Using cached idna-3.20-py3-none-any.whl.metadata (7.2 kB)
Collecting requests==2.34.2 (from -r requirements.txt (line 4))
Using cached requests-2.34.2-py3-none-any.whl.metadata (4.8 kB)
Collecting urllib3==2.8.0 (from -r requirements.txt (line 5))
Using cached urllib3-2.8.0-py3-none-any.whl.metadata (7.4 kB)
Using cached certifi-2026.10.23-py3-none-any.whl (135 kB)
Using cached charset_normalizer-3.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (254 kB)
Using cached idna-3.20-py3-none-any.whl (69 kB)
Using cached requests-2.34.2-py3-none-any.whl (73 kB)
Using cached urllib3-2.8.0-py3-none-any.whl (135 kB)
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
Successfully installed certifi-2026.10.23 charset-normalizer-3.5.2 idna-3.20 requests-2.34.2 urllib3-2.8.0
(venv) kaito@demo:~/linux-practice/python-test$ pip list
Package Version
------------------ ----------
certifi 2026.10.23
charset-normalizer 3.5.2
idna 3.20
pip 25.1.1
requests 2.34.2
urllib3 2.8.0
(venv) kaito@demo:~/linux-practice/python-test$ python hello.py
requests を読み込めました: 2.34.2
動かした Python: /home/kaito/linux-practice/python-test/venv/bin/python作り直した直後の pip list は pip だけでしたが、pip install -r requirements.txt のあとは、requirements.txt に書いたのと同じバージョンの5つがそろい、hello.py も同じように動きました。
Using cached は、「前にダウンロードしたものが、このパソコンの中(~/.cache/pip)に残っていたので、それを使った」という意味です。同じパソコンで作り直したのでこう表示されました。別のパソコンで初めて入れるときは、Downloading と表示されて、インターネットから取ってきます。
練習用のスクリプトを動かす
nano hello.py で、次の中身を書いて保存します。どの Python で動いたかを表示する、小さなスクリプトです。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
import sys
try:
import requests
print("requests を読み込めました:", requests.__version__)
except ModuleNotFoundError:
print("requests が見つかりません")
print("動かした Python:", sys.executable)- 1
python hello.py(例)
- 1
- 2
- 3
(venv) kaito@demo:~/linux-practice/python-test$ python hello.py
requests を読み込めました: 2.34.2
動かした Python: /home/kaito/linux-practice/python-test/venv/bin/pythonvenv から出る
deactivate で venv から出ます。出たあとで、同じスクリプトをパソコン全体の Python で動かしてみましょう。
- 1
- 2
- 3
deactivate
which python3
python3 hello.py(例)
- 1
- 2
- 3
- 4
- 5
- 6
(venv) kaito@demo:~/linux-practice/python-test$ deactivate
kaito@demo:~/linux-practice/python-test$ which python3
/usr/bin/python3
kaito@demo:~/linux-practice/python-test$ python3 hello.py
requests が見つかりません
動かした Python: /usr/bin/python3プロンプトの先頭から (venv) が消えました。
venv の中に入れた requests は、venv の外からは見えません。「pip install したのに ModuleNotFoundError になる」ときは、たいていこの「入れた場所と、動かした Python のずれ」が原因です。
venv に入らずに、venv の Python で動かす
activate しなくても、venv の中の Python を場所つきで指定すれば、venv の中のライブラリを使えます。
- 1
- 2
venv/bin/python hello.py
~/linux-practice/python-test/venv/bin/python ~/linux-practice/python-test/hello.py(例)
- 1
- 2
- 3
- 4
- 5
- 6
kaito@demo:~/linux-practice/python-test$ venv/bin/python hello.py
requests を読み込めました: 2.34.2
動かした Python: /home/kaito/linux-practice/python-test/venv/bin/python
kaito@demo:~/linux-practice/python-test$ ~/linux-practice/python-test/venv/bin/python ~/linux-practice/python-test/hello.py
requests を読み込めました: 2.34.2
動かした Python: /home/kaito/linux-practice/python-test/venv/bin/pythonこの書き方は、シェルスクリプトや、nohup、次の記事の cron で Python を動かすときにとても大事です。cron(=決まった日時に、コマンドをくり返し自動で実行してくれるしくみ)では activate を使いにくいので、venv の Python をフルパスで書くのがかんたんです。
venv フォルダは、requirements.txt があれば、いつでも作り直せます。中身はとても大きく、パソコンごとにちがうので、Git(=ファイルの変更の履歴を記録しておく道具)で管理するときは .gitignore に venv/ を書いて、入れないようにしましょう。作り直すときは、新しい venv を作って pip install -r requirements.txt と打つだけです。
🤖 詰まったらAIに聞こう:pip や venv のエラーが直らない
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Linuxの初心者です。Python の環境づくりでつまずいています。
次のエラーの原因と直し方を、やさしく説明してください。
--break-system-packages や sudo pip は使わず、apt と venv を使う方法でお願いします。
【使っている環境】WSLのUbuntu、Debian など
【python3 --version と which python3 の結果】ここに貼る
【venv に入っているか】例:プロンプトの先頭に (venv) がついている/ついていない
【打ったコマンド】ここに貼る
【表示されたエラー】ここに貼る
【requirements.txt の中身(あれば)】ここに貼るPython のスクリプトや設定ファイル(.env など)には、APIキー、トークン、パスワードを書いていることがよくあります。APIキーやトークンは、Web のサービスを使うときに本人の代わりになる、合言葉のような文字列です。エラーと一緒にスクリプトを貼るときは、それらを必ず「***」に置き換えてください。.env(=APIキーなどの秘密の設定を書いておくファイル)ファイルの中身は、まるごと貼らないようにしましょう。
よくある質問
Q. python と打つと「command not found」になります。
Debian や Ubuntu では、Python 3 は python3 という名前で入っていて、python という名前はありません。この連載では、いつも python3 と打ちます。venv の中に入っているあいだは、python でも venv の Python が動きます(venv/bin に python があるからです)。
Q. venv の名前は venv でないといけませんか?
いいえ、好きな名前をつけられます。python3 -m venv .venv のように、. で始まる名前にして、ls で見えないようにする人も多いです。名前を変えたときは、source .venv/bin/activate のように、入るときの場所も変わります。
Q. いらなくなった venv は、どう消せばいいですか?
venv は、ただのフォルダです。deactivate で出てから、そのフォルダを消せば終わりです。rm -r で消すときは、消す前に ls で、本当に venv のフォルダか(中に bin や pyvenv.cfg があるか)を確かめましょう。requirements.txt が残っていれば、あとで作り直せます。
まとめ
- Linux では、Python 本体は apt、ライブラリは venv の中の pip で入れる
- 「externally-managed-environment」は、全体の Python を守るための案内。
--break-system-packagesやsudo pipでは消さない -
python3 -m venv venvで作り、source venv/bin/activateで入る。プロンプトに(venv)がつく -
pip freeze > requirements.txtで入れたものを記録し、pip install -rで作り直せる -
deactivateで出る。venv の外からは、venv に入れたライブラリは見えない - 入らずに使うときは
venv/bin/pythonをフルパス(=いちばん上の/から書いた場所)で指定する
次の記事では、今回の venv の Python を使って、毎朝決まった時刻にスクリプトを自動で動かす cron を設定します。
次に読む記事
関連する記事
- Python入門|環境構築と最初の1本を動かす:Python の最初の1本を、ていねいに動かしてみたい方に
- プロが使う.gitignoreパターン集|現場で効くテンプレ:venv や .env を Git に入れない書き方を知りたい方に
- Pythonで毎朝のCSV集計を自動化する(pandas+定期実行):venv に pandas を入れて、実際の自動化を作ってみたい方に