LoginSignup
6

More than 1 year has passed since last update.

posted at

updated at

7系LinuxにPython3+OCI CLIをインストールする&2020/2/13以降はOCI CLIがサポートするPythonのバージョンが3.5+になる件

1. はじめに

「最近OCI CLIをアップデートしていないなあ」と思いながらCLIをアップデート。CLIを実行すると、驚きのメッセージが赤文字で表示!

$ oci iam region list
WARNING: OCI CLI now requires Python 3.5+. Please install or upgrade
your version of Python to 3.5+ before February 13, 2020 to avoid
interruption to CLI usage.

冷静に考えると、Python 2のサポート期限は2020年3月末まで。

Oracle Linux 7のPythonは2.x系。ってことで対応策を調べてみました。

$ python -V
Python 2.7.5

1-1. TL;DR

  • 2020/2/13以降、OCI CLIがサポートするPythonのバージョンは3.5+になる
  • Pythonの環境構築方法がたくさんある

1-2. 対象読者

  • Oracle Cloud Infrastructure Compute利用者
  • これからOracle Linux 7 / CentOS 7 にOCI CLIをインストールする人
  • すでにOracle Linux 7 / CentOS 7 でOCI CLIを使っていて、Python 3にマイグレーションが必要な人

※8系LinuxやUbuntu、Windows、MacはPython 3なので、この問題は影響しない。

1-3. 参考資料

日本語マニュアル

英語マニュアル

2. OCI CLIの環境構築を考える

OCI CLIを使用するにはPython 3が必要だ。しかしPythonの環境構築は多種多様で、利用者にとって悩ましい状況だ。全体像を振り返り、インストール方針を考える。

2-1. OCI CLIのインストール方法

OCI CLIのインストール方法は「上記マニュアル」や「次のQiita記事」で数多く紹介されている。微妙に異なるのもあるが、だいたい同じだろう。

2-2. Pythonの環境構築問題

問題はPythonの環境構築だ。そもそもOracle Linux 7 / CentOS 7でPython 3を使用する方法が複数あり、さらにPythonパッケージの管理方法も複数ある。次の記事を読むとわかるが、きわめて複雑な状況になっている。

今回はシンプルに考えて、次の条件で絞ってみる。

  • RHEL7系ディストリビューションを利用する
  • Linuxディストリビューションが提供しているものをなるべく使う

それで考えつくのが以下の方法だ。

  • ディストリビューションの標準リポジトリ
  • ディストリビューションのSoftware Collections
  • EPELリポジトリ

標準リポジトリにPython 3.xは含まれていないので「Software Collections」か「EPEL」と思っていたら、以下のニュースソースによると7.7以降(2019/8-)は標準リポジトリに含まれるらしい。

確認すると、以下のように標準リポジトリ(ol7_latest)に含まれている。次章では、これを利用してインストールを試みる。

$ sudo yum list available python3
Loaded plugins: langpacks, ulninfo
Available Packages
python3.i686                 3.6.8-10.0.1.el7                ol7_optional_latest
python3.x86_64               3.6.8-10.0.1.el7                ol7_latest★こっち

3. Python 3の環境構築

Oracle Linux 7にPython 3をインストールする。それに加えて、Pythonの環境構築に便利なvenvについても説明する。

OCI CLIは、Pythonの仮想環境を管理するvenv/virtulenvを内部的に使用している。そのため利用者がインストール時にvenv/virtulenvを使用する必要はない。

3-1. Python 3 のインストール

  1. Python 3をインストールする。
$ sudo yum install -y python3

2.バージョンを確認すると2.7.5のままだ。

$ python -V
Python 2.7.5

3.理由は、次のようにpython3というコマンドだからだ。

$ python3 -V
Python 3.6.8

4.シンボリックリンクを確認すると以下のとおり。

$ ls -l /usr/bin/py*
-rwxr-xr-x. 1 root root    78 12月  5 10:34 /usr/bin/pydoc
lrwxrwxrwx. 1 root root     8 12月 24 16:08 /usr/bin/pydoc3 -> pydoc3.6
-rwxr-xr-x. 1 root root    78  8月  7 17:04 /usr/bin/pydoc3.6
lrwxrwxrwx. 1 root root     7 12月 24 13:08 /usr/bin/python -> python2
lrwxrwxrwx. 1 root root     9 12月 24 13:08 /usr/bin/python2 -> python2.7
-rwxr-xr-x. 1 root root  7144 12月  5 10:34 /usr/bin/python2.7
lrwxrwxrwx. 1 root root     9 12月 24 16:08 /usr/bin/python3 -> python3.6
-rwxr-xr-x. 2 root root 11336  8月  7 17:04 /usr/bin/python3.6
-rwxr-xr-x. 2 root root 11336  8月  7 17:04 /usr/bin/python3.6m
lrwxrwxrwx. 1 root root    10 12月 24 16:08 /usr/bin/pyvenv -> pyvenv-3.6
-rwxr-xr-x. 1 root root   435  8月  7 17:04 /usr/bin/pyvenv-3.6

注意
ここで/usr/bin/pythonのリンク先をpython3に変更してはいけない。なぜならばyumをはじめとする多くのコマンドがPython 2.xに依存しているからだ。シンボリックリンクを張り替えたらトラブルが続出するので気を付けてほしい。

5.rpmパッケージの中身を確認すると以下のとおり。

$ rpm -ql python3
/usr/bin/pydoc3
/usr/bin/pydoc3.6
/usr/bin/python3
/usr/bin/python3.6
/usr/bin/python3.6m
/usr/bin/pyvenv
/usr/bin/pyvenv-3.6
/usr/share/doc/python3-3.6.8
/usr/share/doc/python3-3.6.8/README.rst
/usr/share/licenses/python3-3.6.8
/usr/share/licenses/python3-3.6.8/LICENSE
/usr/share/man/man1/python3.1.gz
/usr/share/man/man1/python3.6.1.gz

3-2. Python 3 仮想環境の理解

Pythonには、1つのマシンで複数のPythonおよびPythonパッケージを管理する方法がたくさんある。今回は、もっとも標準的でOCI CLIインストーラーも使用しているvenvを紹介する。venvは、従来のvirtualenvがPython 3.3から標準機能として取り込まれたものだ。

venvpyvenvが混在して戸惑うが、実体はどちらも同じvenvだ。pyvenvはvenvを操作するスクリプトで現在は非推奨。
https://docs.python.org/3.6/library/venv.html

The pyvenv script has been deprecated as of Python 3.6 in favor of using python3 -m venv to help prevent any potential confusion as to which Python interpreter a virtual environment will be based on.

venvの使用方法は次のとおり。

仮想環境の作成

python3 -m venv <環境パス名>

仮想環境の有効化

source <環境パス名>/bin/activate

仮想環境の無効化

deactivate

3-3. Python 3 仮想環境の構築

この作業はOCI CLIのインストールには不要だが、後述する調査で使用するので説明する。

  1. OCI CLI用の仮想環境を作成する。oci_cliは仮想環境を構築するディレクトリ名であり、別の文字列でもよい。
$ python3 -m venv oci_cli

2.確認すると、以下のディレクトリやファイルが作成されている。中身を理解する必要はないが、詳細を知りたい人は公式マニュアルを参照のこと。

$ ls -d  oci_cli/*
oci_cli/bin  oci_cli/include  oci_cli/lib  oci_cli/lib64  oci_cli/pyvenv.cfg

3.仮想環境を有効化する。仮想環境が有効になると、プロンプトの先頭に仮想環境名が表示される。<環境パス名>の部分は、カレントディレクトリからの相対パスである。

$ source oci_cli/bin/activate
(oci_cli) [opc@hostname ~]$

4.Pythonのバージョンを確認すると3.6.8になっている。

(oci_cli) [opc@hostname ~]$ python -V
Python 3.6.8

5.無効化するにはdeactivateを入力する。仮想環境を無効にすると、元のバージョンに戻ることがわかる。

(oci_cli) [opc@hostname ~]$ deactivate
[opc@hostname ~]$ python -V
Python 2.7.5

ここまでがPythonの仮想環境の基礎知識だ。次にOCI CLIをインストール/アップデートする。

4. OCI CLIのセットアップ

次にOCI CLIをインストールする。OCI CLIインストーラーを実行するには、インターネットにアクセスできる必要がある。

4-1. OCI CLIのインストール

OCI CLIをインストールする。すでにPython 2.xでOCI CLIを利用しているときでも、Pythonライブラリのインストール先が異なるので再インストールが必要になる。ただし$HOME/.oci配下の設定ファイルは、そのまま利用できる。

  1. OCI CLIのインストーラーを実行する。なお、opcやoracleユーザーなど、OCI CLIを実行するOSユーザーで実行すること。
$ bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"

2.既存からのアップデートのときは以下のように表示されるので「y」を入力して上書きする。

===> In what directory would you like to place the install? (leave blank to use '/home/opc/lib/oracle-cli'):
-- Install directory '/home/opc/lib/oracle-cli' is not empty and may contain a previous installation.

===> Remove this directory? (y/N):★yを入力

3.その後、いくつか入力が求められるが「すべてリターンキー」でよい。

4.終了すると以下のように出力される。

-- ** Run `exec -l $SHELL` to restart your shell. **
--
-- Installation successful.
-- Run the CLI with /home/opc/bin/oci --help

5.$HOME/.bashrcに追記した内容を有効化するためシェルを再起動する。

$ exec -l $SHELL

6.Python 2からアップデートすると、以下のように2.7を参照する行が残ったままになる。しかし、実行されないので残したままでも問題ない。

$HOME/.bashrc
[[ -e "/home/opc/lib/oracle-cli/lib/python2.7/site-packages/oci_cli/bin/oci_auto
complete.sh" ]] && source "/home/opc/lib/oracle-cli/lib/python2.7/site-packages/
oci_cli/bin/oci_autocomplete.sh"

[[ -e "/home/opc/lib/oracle-cli/lib/python3.6/site-packages/oci_cli/bin/oci_auto
complete.sh" ]] && source "/home/opc/lib/oracle-cli/lib/python3.6/site-packages/
oci_cli/bin/oci_autocomplete.sh"

7.OCI CLIのバージョンを確認すると次のとおり。

$ oci --version
2.7.0

4-2. コンフィグ・ファイルの設定

Python 2からアップデートしたときは何もしなくてよい。$HOME/.oci配下のコンフィグ・ファイルをそのまま利用できる。インストールに成功すると、OCI CLIを実行しても冒頭で紹介した警告メッセージは表示されなくなる。

新規インストールのときは以下のページを参考に設定すること。

5. インストール環境の調査

せっかくPythonの仮想環境を説明したので確認してみよう。OCI CLIは$HOME/lib/oracle-cliにインストールされている。

  1. デフォルトのPython 3環境にOCI CLIはインストールされていない。
$ pip3 list --format=columns
Package    Version
---------- -------
pip        9.0.3
setuptools 39.2.0

2.仮想環境を有効にする。

$ source lib/oracle-cli/bin/activate
(oracle-cli) [opc@hostname ~]$

3.仮想環境にインストールされているパッケージを確認すると、OCI Python SDKとOCI CLIが表示される。

(oracle-cli) [opc@hostname ~]$ pip3 list
Package         Version
--------------- ----------
arrow           0.10.0
asn1crypto      1.2.0
certifi         2019.11.28
cffi            1.13.2
click           6.7
configparser    3.5.0
cryptography    2.4.2
idna            2.6
jmespath        0.9.3
oci             2.8.0 ★OCI Python SDK 
oci-cli         2.7.0 ★OCI CLI
pip             19.3.1
pycparser       2.19
pyOpenSSL       18.0.0
python-dateutil 2.7.3
pytz            2016.10
PyYAML          5.1.2
retrying        1.3.3
setuptools      42.0.2
six             1.11.0
terminaltables  3.1.0
wheel           0.33.6

おまけ:仮想環境ではpip3ではなくpipも利用できる。どちらも同じ出力結果だが、仮想環境をアクティブにすると、仮想環境にインストールされているpipが使えるようになる。/usr/binにはpipがない。

$ find $HOME /usr/bin -name "pip*"
/home/opc/.cache/pip
/home/opc/lib/oracle-cli/lib/python3.6/site-packages/pip
/home/opc/lib/oracle-cli/lib/python3.6/site-packages/pip-19.3.1.dist-info
/home/opc/lib/oracle-cli/bin/pip
/home/opc/lib/oracle-cli/bin/pip3
/home/opc/lib/oracle-cli/bin/pip3.6
/home/opc/lib/oracle-cli/pip-selfcheck.json
/usr/bin/pip3 ★pipがない
/usr/bin/pip-3
/usr/bin/pip-3.6
/usr/bin/pip3.6

4.アップデートされているパッケージがあるか確認する。OCI CLIをセットアップしたばかりだと、次のようにociとoci-cliは表示されない。それ以外のパッケージは依存性もあるので古くても気にしないこと。

(oracle-cli) [opc@hostname ~]$ pip3 list -o
Package         Version Latest Type
--------------- ------- ------ -----
arrow           0.10.0  0.15.4 wheel
click           6.7     7.0    wheel
configparser    3.5.0   4.0.2  wheel
cryptography    2.4.2   2.8    wheel
idna            2.6     2.8    wheel
jmespath        0.9.3   0.9.4  wheel
pyOpenSSL       18.0.0  19.1.0 wheel
python-dateutil 2.7.3   2.8.1  wheel
pytz            2016.10 2019.3 wheel
PyYAML          5.1.2   5.2    sdist
six             1.11.0  1.13.0 wheel

5.新しいバージョンがリリースされているときは、以下のコマンドでアップデートできる。

(oracle-cli) [opc@hostname ~]$ pip3 install oci-cli --upgrade

6.仮想環境を無効にして終了だ。

(oracle-cli) [opc@hostname ~]$ deactivate
[opc@hostname ~]$

6. OCI CLIのアップデート

先ほどpip3 install oci-cli --upgradeでOCI CLIをアップデートする方法を紹介した。実際には次の2つのアップデート方法がある。

  1. OCI CLIインストーラーで再インストールする
  2. pip/pip3コマンドでアップデートする

再インストールはコマンド一発なので、pip/pip3の方法を実際の出力を含めて紹介する。

  1. OCI CLIのインストール先ディレクトリに移動する。
$ cd <インストール先ディレクトリ>

2.仮想環境を有効にして、新しいバージョンがあるか確認する。この例では新しいバージョンが表示されている。

source lib/oracle-cli/bin/activate
pip3 list -o
---ここか下が出力---
Package         Version Latest Type
--------------- ------- ------ -----
arrow           0.10.0  0.15.5 wheel
cffi            1.13.2  1.14.0 wheel
click           6.7     7.1.1  wheel
configparser    3.5.0   4.0.2  wheel
idna            2.6     2.9    wheel
jmespath        0.9.3   0.9.5  wheel
oci             2.10.2  2.12.1 wheel ★新しいバージョンがある
oci-cli         2.9.0   2.9.7  wheel ★新しいバージョンがある
pycparser       2.19    2.20   wheel
pyOpenSSL       18.0.0  19.1.0 wheel
python-dateutil 2.7.3   2.8.1  wheel
pytz            2016.10 2019.3 wheel
PyYAML          5.1.2   5.3.1  sdist
setuptools      45.1.0  46.1.1 wheel
six             1.11.0  1.14.0 wheel

3.パッケージをアップデートする。最後に「Successfully installed」と表示されたらアップデートに成功している。

pip3 install oci-cli --upgrade
出力の一部
Collecting oci-cli
  Downloading oci_cli-2.9.7-py2.py3-none-any.whl (7.5 MB)
     |████████████████████████████████| 7.5 MB 6.1 MB/s
Collecting configparser>=4.0.2
  Downloading configparser-4.0.2-py2.py3-none-any.whl (22 kB)
Requirement already satisfied, skipping upgrade: terminaltables==3.1.0 in ./lib/oracle-cli/lib/python3.6/site-packages (from oci-cli) (3.1.0)
Requirement already satisfied, skipping upgrade: certifi in ./lib/oracle-cli/lib/python3.6/site-packages (from oci-cli) (2019.11.28)
Requirement already satisfied, skipping upgrade: PyYAML==5.1.2 in ./lib/oracle-cli/lib/python3.6/site-packages (from oci-cli) (5.1.2)
Requirement already satisfied, skipping upgrade: retrying==1.3.3 in ./lib/oracle-cli/lib/python3.6/site-packages (from oci-cli) (1.3.3)
Requirement already satisfied, skipping upgrade: idna<2.7,>=2.5 in ./lib/oracle-cli/lib/python3.6/site-packages (from oci-cli) (2.6)
Requirement already satisfied, skipping upgrade: pytz>=2016.10 in ./lib/oracle-cli/lib/python3.6/site-packages (from oci-cli) (2016.10)
Collecting oci==2.12.0
  Downloading oci-2.12.0-py2.py3-none-any.whl (3.6 MB)
     |████████████████████████████████| 3.6 MB 2.3 MB/s
★中略
      Successfully uninstalled oci-cli-2.9.0
Successfully installed arrow-0.14.7 configparser-4.0.2 jmespath-0.9.4 oci-2.12.0 oci-cli-2.9.7 six-1.14.0

4.最後に仮想環境を非アクティブにすれば終了だ。

(oracle-cli) [opc@hostname ~]$ deactivate
[opc@hostname ~]$

7. まとめ

  • 2020/2/13以降、OCI CLIがサポートするPythonのバージョンは3.5+になる。
  • Oracle Linux / CentOS 7でPython 3を使用するには、標準リポジトリのpython3がオススメ
  • OCI CLIインストーラーを使用すると、インストールとアップグレードの両方ができる
  • OCI CLIは、Pythonの仮想環境にインストールされる

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6