linuxBean14.04(115)pythonコマンドをpipコマンドとともに切り替える

linuxBean14.04(39)Pythonのパッケージ管理をPyCharmで行うでは
Terminalからpipコマンドで起動するバージョンの切替方法がわかりませんでした。pythonコマンドも切り替えたいのでその方法を考えることにしました。

前の関連記事:linuxBean14.04(114)「./myscript」「myscript」「source myscript」「. myscript」の違い

(2016.12.2追記。pythonコマンドは通常はpython2.7に割り当てておいた方がよいです。sambaのアップデートに失敗します。linuxBean14.04(129)pythonコマンドにはpython2.7を割り当てておく参照。)

AnacondaのPythonを使うかどうかは環境変数PATHの変更で対応する


linuxBean14.04(72)Anacondaで科学技術系Pythonパッケージを一括インストールするのAnacondaは~/.bashrcにexport PATH=/home/pq/anaconda3/bin:$PATH (/home/pqはホームディレクトリ)を書いておくことでコマンドが使えるようになっています。

つまり単純にPATHを通しているだけです。

ということでAnacondaを使うTerminalと使わないTerminalのランチャを作ろうとしたのですが、xfce4-terminalの-eオプションでexportコマンドを続けるとエラーが出てうまくいきませんでした。

pq@pq-VirtualBox:~$ xfce4-terminal -H -e "export PATH=/home/pq/anaconda3/bin:$PATH"
Failed to connect to session manager: セッションマネージャーへの接続に失敗しました: SESSION_MANAGER environment variable not defined
どうしても解決できなかったので起動したTerminalでAnacondaのパスを通すスクリプトを作ることにしました。

~/.bashrcにあるexport PATH=/home/pq/anaconda3/bin:$PATHをコメントアウトしました。
#! /bin/sh
export ANA_PATH_BACKUP="$PATH"  # 既存の変数をバックアップ。
export PATH="/home/pq/anaconda3/bin:$PATH"  # AnacondaのパスをPATHを追加。
export CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt  # Anaconda用curlの設定。
これをanaというファイル名でホームディレクトリに保存しました。

Terminalを起動して「. ana」か「. ~/ana」(ホームディレクトリ以外にいるとき)でAnacondaへのパスが有効になります。
(ドット.の後ろにスペースが入っています。)

4行目のAnaconda用curlの設定についてはlinuxBean14.04(107)nvmでnode.jsのインストールができない問題への対応で必要だったものです。
#! /bin/sh
export PATH="$ANA_PATH_BACKUP"
unset CURL_CA_BUNDLE
Terminalを終了すればAnacondaへのパスが無効になるのですが、一応同じTerminalで無効にできるdeanaというスクリプトも作りました。

. deana」か「. ~/deana」(ホームディレクトリ以外にいるとき)でAnacondaへのパスが有効になります。
pq@pq-VirtualBox:~$ which python
/usr/bin/python
pq@pq-VirtualBox:~$ which pip
/usr/local/bin/pip
pq@pq-VirtualBox:~$ . ana
pq@pq-VirtualBox:~$ which python
/home/pq/anaconda3/bin/python
pq@pq-VirtualBox:~$ which pip
/home/pq/anaconda3/bin/pip
pq@pq-VirtualBox:~$ . deana
pq@pq-VirtualBox:~$ which python
/usr/bin/python
これでAnacondaのPythonへの切り替えがうまくできるようになりました。

update-alternativesでpythonとpipを切り替える


update-alternativesの仕組みについてはupdate-alternativesの使い方 - gggggraziegrazieの解説図がとてもわかりやすいです。

update-alternativesがシンボリックの実体へのリンクを付け替えてくれます。

linuxBean(22)デフォルトのブラウザをChromeに変更するでデフォルトブラウザを変更するときにも使いました。

/usr/bin/python2.7
/usr/bin/python3.4

この2つのPythonインタープリタとそれぞれのpipをupdate-alternativesで切り替えることにします。

/usr/local/bin/pipをシンボリックにするので先にこれを削除しておかないといけません。

/usr/local/bin/pip.bkと改名しておきました。
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 30 --slave /usr/local/bin/pip pip /usr/local/bin/pip2.7
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.4 20 --slave /usr/local/bin/pip pip /usr/local/bin/pip3.4
sudo update-alternatives --install <シンボリック> <名前> <実体> <優先度> --slave <シンボリック> <名前> <実体>

<シンボリック>のパスに<実体>にリンクしたシンボリックが作成されます。

<優先度>は数字が大きい方が優先されます。

linuxBean14.04(27)Geanyとシェルスクリプトのデバッグで導入したpython-pygmentsはpython3では動かないのでpython2.7の方がデフォルトになるように<優先度>の数値を大きくしています。

 --slaveは付随して作成されるシンボリックです。

切り替えるもの同士は<シンボリック>と<名前>を同一にしておく必要があります。

sudo update-alternatives --config  <名前>

切り替えるときは<名前>で一覧を呼び出します。
pq@pq-VirtualBox:~$ sudo update-alternatives --config python
alternative python (/usr/bin/python を提供) には 2 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /usr/bin/python2.7   30        自動モード
  1            /usr/bin/python2.7   30        手動モード
  2            /usr/bin/python3.4   20        手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: 
デフォルトでは自動モードになっているので<優先度>の数値が高いものが自動的に選択されています。
pq@pq-VirtualBox:~$ python -V
Python 2.7.6
pq@pq-VirtualBox:~$ pip -V
pip 7.1.0 from /usr/local/lib/python2.7/dist-packages (python 2.7)
pq@pq-VirtualBox:~$ sudo update-alternatives --config python
alternative python (/usr/bin/python を提供) には 2 個の選択肢があります。

  選択肢    パス              優先度  状態
------------------------------------------------------------
* 0            /usr/bin/python2.7   30        自動モード
  1            /usr/bin/python2.7   30        手動モード
  2            /usr/bin/python3.4   20        手動モード

現在の選択 [*] を保持するには Enter、さもなければ選択肢の番号のキーを押してください: 2
update-alternatives: /usr/bin/python (python) を提供するために 手動モード で /usr/bin/python3.4 を使います
pq@pq-VirtualBox:~$ python -V
Python 3.4.3
pq@pq-VirtualBox:~$ pip -V
pip 7.1.0 from /usr/local/lib/python3.4/dist-packages (python 3.4)
これでpythonとpipを連動して切り替えできるようになりました。

LibreOfficeのバンドルPythonはupdate-alternativesで切り替えできず


LibreOfficeのバンドルPythonの/opt/libreoffice5.0/program/pythonもupdate-alternativesで切り替えたかったのですが、update-alternativesで作成したシンボリックからは起動できませんでした。

sudo update-alternatives --install /usr/bin/python python /opt/libreoffice5.0/program/python 10

これで登録してpythonコマンドに実体をリンクさせるとエラーがでて起動できません。
pq@pq-VirtualBox:~$ python
/usr/bin/python: 52: exec: /etc/alternatives/python.bin: not found
これは/opt/libreoffice5.0/program/pythonがシェルスクリプトでその中でpwdコマンドを使ってディレクトリのパスを取得してpython.binのパスを作成しているために、シンボリックリンクの場合pwdで得られるパスが実体の方ではなくシンボリックの方になってしまっているのが原因です。

pwd -P
-P (physical) flagをつければ実体のパスを出力してくれますが/opt/libreoffice5.0/program/pythonを書き換えないといけません。

files - Resolving symbolic links (pwd) - Unix & Linux Stack Exchange

ここにでてくる例がとてもわかりやすかったです。
pq@pq-VirtualBox:~/_tmp$ mkdir a  # 実体のディレクトリaを作成。
pq@pq-VirtualBox:~/_tmp$ ln -s a S  # 実体aのシンボリックSを作成。
pq@pq-VirtualBox:~/_tmp$ cd S  # シンボリックSに移動。
pq@pq-VirtualBox:~/_tmp/S$ pwd  # シンボリックSでpwdの結果はSのパスを出力。
/home/pq/_tmp/S
pq@pq-VirtualBox:~/_tmp/S$ pwd -P  # -Pフラッグをつけると実体のパスを出力。
/home/pq/_tmp/a
pq@pq-VirtualBox:~/_tmp/S$ cd ..  # 上のディレクトリに戻る。
pq@pq-VirtualBox:~/_tmp$ cd -P S  # 今度は-PフラッグをつけてシンボリックSに移動。
pq@pq-VirtualBox:~/_tmp/a$ pwd  # シンボリックSではなく実体aのディレクトリに直接移動。
/home/pq/_tmp/a
pq@pq-VirtualBox:~/_tmp/a$ cd .. # 上のディレクトリに戻る。
pq@pq-VirtualBox:~/_tmp$ set -o physical  # これで-Pフラッグが以降自動的につく。
pq@pq-VirtualBox:~/_tmp$ cd S
pq@pq-VirtualBox:~/_tmp/a$ pwd  # pwd -Pと同じ結果になる。
/home/pq/_tmp/a
/opt/libreoffice5.0/program/pythonの最初にset -o physicalを挿入すればうまくいくと思いましたが、/usr/bin/python: 19: set: Illegal option -o physicalと言われてダメでした。

ということでLibreOfficeのバンドルPythonについては切り替えずに、これまで通りフルパスで使うことにしました。

sites.pthを設定しているPython3.3はシステムPythonの方をアンイストール


Python3.3はlinuxBean14.04(38)LibreOfficeバンドルPythonにパッケージを追加でインストールしたものです。

linuxBean14.04(86)AnacondaのパッケージをLibreOfficeマクロで使うでAnacondaのものを使うことにしたのと、pipコマンドのAnacondaのものとの衝突を解決できなかったので、システムPythonの3.3はアンイストールすることにしました。

pipはlinuxBean14.04(43)動かないpipを再インストールで各Pythonのインタープリタごとにインストールしたものです。

pipコマンドは/usr/local/bin/pipが起動するPythonスクリプトになっておりそれのshebang(1行目)でPythonのバージョンを切り替えています。

同じフォルダにあるpip2.7、pip3.3、pip3.4がどのPythonインタープリタと連動しているか調べたところpip3だけはAnacondaのパッケージになっていました。
pq@pq-VirtualBox:/usr/local/bin$ pip2.7 -V
pip 7.1.0 from /usr/local/lib/python2.7/dist-packages (python 2.7)
pq@pq-VirtualBox:/usr/local/bin$ pip3.3 -V
pip 8.0.1 from /home/pq/anaconda3/envs/py335/lib/python3.3/site-packages (python 3.3)
pq@pq-VirtualBox:/usr/local/bin$ pip3.4 -V
pip 7.1.0 from /usr/local/lib/python3.4/dist-packages (python 3.4)
これはlinuxBean14.04(86)AnacondaのパッケージをLibreOfficeマクロで使うで作成した~/.local/lib/python3.3/site-packages/sites.pthが原因です。

パッケージの検索順をAnacondaのものを先にしているからです。

ということでPython3.3をSynapticパッケージマネージャでアンインストールしました。


真紅のものが完全削除指定したものです。

参考にしたサイト


update-alternativesの使い方 - gggggraziegrazie
シンボリックリンクの仕組みについてわかりやすい図があります。

files - Resolving symbolic links (pwd) - Unix & Linux Stack Exchange
ディレクトリのシンボリックリンクとpwdの関係について-Pフラッグのわかりやすい例が載っています。

シェル変数や環境変数を削除するコマンド - Qiita
環境変数の削除にはunsetコマンドを使います。

Manpage for xfce4-terminal - man.cx manual pages
xfce4-terminalのmanページ。

次の関連記事:linuxBean14.04(116)BashEclipseでシェルスクリプトのデバッグ

PR

0 件のコメント:

コメントを投稿