guijiu
@guijiu (taka kuwa)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

UbuntuのOSシステムのでpythonの使われ方を教えてください。

Q&A

Closed

解決したいこと

Ubuntuには、pythonが元々インストールされていると次のHPに記述されていました。

Ubuntu環境のPython
https://www.python.jp/install/ubuntu/index.html

引用すると次の通りです。

Ubuntu には最初からPythonがインストールされており、そのまま利用可能です。

しかし、このPython は、 OS がさまざまな機能を提供するために使用しています。
ユーザが勝手にパッケージを導入したりすると、 OS の安定性を損なうことも考えられますので、
別途、あたらしいPythonをインストールするのが一般的です。

そこで、実際Ubuntuシステムでpythonがどのように使われているか、具体的に教えて頂けないでしょうか。
Ubuntuシステムにどのようなpythonのスクリプトファイル(xxx.py)があり、どのように呼び出され実行されるのかなど。

<回答の例>
次のcronでスケジューリングされていてcorontabに次のように記述されている。
*/5 * * * * /usr/bin/python3 /home/ubuntu/test.py >> /home/ubuntu/test.log

と言った感じで、具体的にご回答頂けるとありがたいです。

質問の背景

今、WSL2のUbuntu22.04.3LTSに開発環境として、python3.12.3をインストールしようとしています。

<python3.12.3をインストールする前に>

ご存じのとおりUbuntu22.04.3LTSには、元々python3.10.12がインストールされていますが、これはubuntuシステムがOSの機能提供用に使われます。また、which python3とコマンドを打つと、/usr/bin/python3と返されます。さらに、コマンドプロンプトからpython3 若しくは/usr/bin/python3と実行するとpython3.10.12が起動します。

<python3.12.3をインストール>

次の要領でpython3.12.3をインストールします。

sudo apt update

sudo apt install build-essential libbz2-dev libdb-dev \
 libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
 libncursesw5-dev libsqlite3-dev libssl-dev \
 zlib1g-dev uuid-dev tk-dev

mkdir python_source

cd python_source

wget https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz

tar xJf Python-3.12.3.tar.xz

cd Python-3.12.3

./configure

make

sudo make install

<python3.12をインストール後>

以上によりpython3.12.3をインストールした後、which python3を実行すると、/usr/local/bin/python3と返され、またpyton3もしくは/usr/local/bin/python3 とコマンドを打つと、Python3.12.3が起動します。
また敢えて/usr/bin/python3とコマンドを打てば、Ubuntuシステムで使われるPython3.10.12が起動します。

疑問に思うこと

システムが元々インストールされているPython3.10.12を起動するときに、/usr/bin/python3とコマンドを実行されるのか疑問に思いました。(ただ単にpython3とコマンドを実行するのではないということを確認したい)

以上、よろしくお願いします。

0

3Answer

OS標準のPython(3.10.12)を使っているファイルがどれなのかを特定する方法として、シェバンで#!/usr/bin/python3を定義しているファイルをgrep検索する方法があります。

一例として、netplanはpythonで実装されていますので、以下でgrepを実行すると出てくると思います。

sudo grep -Rl '^#!.*\/usr\/bin\/python3' /usr/

システムが元々インストールされているPython3.10.12を起動するときに、/usr/bin/python3とコマンドを実行されるのか疑問に思いました。(ただ単にpython3とコマンドを実行するのではないということを確認したい)

これはUbuntuのシステムコンポーネントの実装によるかと思いますが、全てを確認するのは非現実的だと思います…
なにかのスクリプト内でpython3コマンドを直接呼び出しているものがもしかしたらあるかもしれないですが、公式の手順に従って別バージョンのPythonをインストールしているので、これが原因でなにかシステム動作に悪影響を及ぼすことはないと思います。

2Like

詳しく知っているわけではありませんが

実際Ubuntuシステムでpythonがどのように使われている

以前(focalまではあったように記憶しています)はpython-dbusを使っていたようですが、最近のUbuntuにはありません。

このほかにはLet's Encryptのcertbotufwなどは現在でも/usr/bin/python3が使われているようです。

ですのでヘタに/usr/bin/python3のリンク先を変えると不具合が発生します。

システムが元々インストールされているPython3.10.12を起動するときに、/usr/bin/python3とコマンドを実行される

systemdが立ち上げてくるサービスなどは環境変数PATHが含まれていないので、絶対パスで実行パスやシバンなどを指定するのが基本となります。

1Like

Comments

  1. @guijiu

    Questioner

    ufwのファイルを見てみました。
    以下のように、スクリプトにシェバンで#! /usr/bin/python3と記述した有りました。
    このように記述されていれば間違いなくシステム用のpythonで動くわけですね。
    ありがとうございました。

    $ which ufw
    /usr/sbin/ufw
    
    $ cat /usr/sbin/ufw
    #! /usr/bin/python3
    # ufw: front-end for Linux firewalling (cli)
    # Copyright 2008-2021 Canonical Ltd.
    

@inetcpl
ご回答頂きありがとうございます。
大変良く理解できました。

しっかりと作られたスクリプトならシェバンで#!/usr/bin/python3と定義して実行するので、ユーザーがインストールされたpython3(/usr/local/bin/python3.xx)が実行されることはないと理解しました。

質問の内容から当方がサンデープログラマであることをお気づき頂きまして、ありがとうございます。シェバンという言葉を初めて知りました。qittaや教科書で#!のことだとわかりました。grepでの検索例もありがとうございます。

普段はwinを使っており、今、余っているpcにlinuxをインストールし、pythonで定時でデータ収集させようと奮闘中です。

0Like

Comments

  1. @guijiu

    しっかりと作られたスクリプトならシェバンで#!/usr/bin/python3と定義して実行するので、ユーザーがインストールされたpython3(/usr/local/bin/python3.xx)が実行されることはないと理解しました。

    はい、ご認識の通りかと思います!
    ご質問に対する完全な回答はできませんでしたが、少しでもお役にたてたようで何よりです。

Your answer might help someone💌