Python environment
==================

TPAは、ターゲットインスタンスの :ref:`Distribution support <Distribution support>` に基づいて、どのPythonインタープリターを使用するかを決定します。可能な場合は常にPython
3を使用し、やむを得ない場合にのみPython 2にフォールバックします。

``tpaexec configure``
コマンドは、ディストリビューションに応じて\ ``preferred_python_version``
を設定します。

.. csv-table::
  :header: Distribution,Python 2,Python 3
  :widths: 12,12,18
  :align: left
  :class: longtable

  Debian 12/bookworm,Yes,Yes (3.11)
  Debian 11/bullseye,Yes,Yes (3.9)
  Debian 10/buster,Yes,Yes (3.7)
  Ubuntu 24.04/noble,No,Yes (3.12)
  Ubuntu 22.04/jammy,No,Yes (3.10)
  Ubuntu 20.04/focal,No,Yes (3.8)
  RHEL 10.x,No,Yes (3.12)
  RHEL 9.x,No,Yes (3.9)
  RHEL 8.x,No,Yes (3.6)
  RHEL 7.x,Yes,No (3.6)
  SLES 15,No,Yes (3.6)

Ubuntu 20.04、22.04、24.04、RHEL 8.x、9.x、10.x、およびSLES 15は、Python
3でのみ使用できます。

RHEL 7.xにはPython 3.6が同梱されていますが、システムPython
3のlibrpmバインディングは利用できません。

他のディストリビューションの場合、\ ``python2`` または\ ``python3``
のどちらを優先するかを決定できますが、新しいクラスターのデフォルトは\ ``python3``
です。

下位互換性
----------

既存のクラスターとの互換性のため、\ ``preferred_python_version``
のデフォルト値は\ ``python2`` ですが、 ``python2``
で既に展開されたシステムでも\ ``python3`` を明示的に選択できます。

.. code:: yaml

   cluster_vars:
     preferred_python_version: python3

TPAは、Python
3を使用できないディストリビューションではこの設定を無視します。

インストールされたスクリプトのPythonインタープリター
----------------------------------------------------

TPAは、クラスターノードに少数のヘルパーPythonスクリプトたとえば、\ ``/etc/tpa/postgres-monitor``
、展開がPostgresが利用可能になるのを待機するために使用する\ ``/etc/tpa/postgres-monitor``
をインストールします。インストールされた各スクリプトのシバン行は、\ ``script_python_interpreter``
ファクトからテンプレート化されています。

デフォルトでは、\ ``script_python_interpreter``
は\ ``/usr/bin/env {{ python }}``
に設定されます。これは、スクリプトが実行時にノードの\ ``PATH``
で最初に見つけた\ ``python3`` バイナリ\ ``env``
の下で実行されることを意味します。これは、TPAの歴史的な動作と一致し、ほとんどのホストでの正しい回答です。TPA自分自身がパッケージインストールのターゲットとしているシステムPythonを選択します。

TPAのインストールされたスクリプトを特定のPythonインタープリターで実行する必要がある場合たとえば、ホストに複数のPythonバージョンがあって、あいまいさを削除したい、または非システムPythonを使用したいため、
``cluster_vars`` の\ ``script_python_interpreter``
をに設定します必要なインタープリターの絶対パス

.. code:: yaml

   cluster_vars:
     script_python_interpreter: /usr/bin/python3

または、非システムPythonをポイントするには

.. code:: yaml

   cluster_vars:
     script_python_interpreter: /opt/python3.11/bin/python3

値は、シバン行の\ ``#!``
の後に逐語的に使用されるため、カーネルが直接\ ``exec``
できるパスである必要があります。この変数を設定する場合、スクリプトをサポートするためにTPAがインストールするOSパッケージたとえば\ ``python3-psycopg2``
がそのインタープリターで利用できることを確認します。TPAがインストールするパッケージに影響を与える方法については、次のセクションを参照してください。

インストールされたパッケージのPythonバージョン
----------------------------------------------

TPAは、スクリプトが依存するPythonモジュール\ ``python3-psycopg2``
などを提供する複数のOSパッケージRPMまたはDEBをインストールします。これらのパッケージ名を構成するために使用される名前プレフィックスは、ディストリビューションで検出されたPython
RHEL
7以外の現在サポートされているすべてのディストリビューションでは\ ``python3``
がデフォルトである\ ``python_pkg_prefix`` ファクトから取得されます。

TPAにデフォルト以外のPythonのパッケージをインストールさせたい場合たとえば、システムPythonとともにPython
3.11をインストールし、TPAをデフォルトの\ ``python3-psycopg2``
ではなく一致する\ ``python311-psycopg2`` パッケージに依存させたいため
``cluster_vars`` に\ ``python_pkg_prefix`` を設定します。

.. code:: yaml

   cluster_vars:
     python_pkg_prefix: python311

TPAは、接頭辞を使用してパッケージ名を構成し、たとえばインストールします。
``python311-psycopg2`` 、\ ``python311-barman`` など。

**重要** ``python_pkg_prefix``
は、\_TPAがインストールするOSパッケージの名前_のみを制御します。自分自身では、どのPythonインタープリターTPAインストールされたスクリプト\ ``/etc/tpa/postgres-monitor``
などで実行されるかは変更されません。複数のPythonインタープリターがインストールされているホストで\ ``python_pkg_prefix``
を設定する場合、ほぼ確実に\ ``script_python_interpreter``
前のセクションを参照してください。一致するインタープリターの絶対パスを設定します。それ以外の場合、TPAのインストールされたスクリプトのデフォルトの\ ``/usr/bin/env``
ベースのシバンは、 ``PATH`` を介して、\ ``python_pkg_prefix``
名前付けパッケージがインストールされたものとは別のPythonに解決される場合があり、インポートは実行時に失敗します。
