linuxBean14.04(160)Pythonのsys.executableは環境変数PATHを参照しているらしい

linuxBean14.04(152)AnacondaとJupyter NotebookとLibreOffice5.2(成功編)のJupyter Notebookでsys.executableを実行すると予想外の値が返ってきたので詳しく調べてみました。

前の関連記事:linuxBean14.04(159)unohelper.ImplementationHelper()をデバッガにかける

sys.executableはAnacondaのインタープリターのパスが返ってくる

sys.executableを実行するとLibreOfficeのバンドルPythonではなく、Anacondaのインタープリターへのパスが返ってきます。
In [1]:
import sys
sys.executable
Out[1]:
'/home/pq/anaconda3/envs/py35/bin/python'
In [2]:
sys.version
Out[2]:
'3.5.3 |Continuum Analytics, Inc.| (default, Mar  6 2017, 11:57:42) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]'
sys.versionもAnacondaのインタープリターを指しています。
わざわざLibreOfficeのバンドルPythonがインタープリターになるように設定したはずなので、どうも納得いかないので、さらに調べてみました。
In [3]:
sys.path
Out[3]:
['',
 '/opt/libreoffice5.2/program',
 '/opt/libreoffice5.2/program/python-core-3.5.0/lib',
 '/opt/libreoffice5.2/program/python-core-3.5.0/lib/lib-dynload',
 '/opt/libreoffice5.2/program/python-core-3.5.0/lib/lib-tk',
 '/opt/libreoffice5.2/program/python-core-3.5.0/lib/site-packages',
 '/opt/libreoffice5.2/program/python-core-3.5.0/lib/python35.zip',
 '/opt/libreoffice5.2/program/python-core-3.5.0/lib/python3.5',
 '/opt/libreoffice5.2/program/python-core-3.5.0/lib/python3.5/plat-linux',
 '/opt/libreoffice5.2/program/python-core-3.5.0/lib/python3.5/lib-dynload',
 '/home/pq/.local/lib/python3.5/site-packages',
 '/home/pq/anaconda3/envs/py35/lib/python3.5',
 '/home/pq/anaconda3/envs/py35/lib/python3.5/plat-linux',
 '/home/pq/anaconda3/envs/py35/lib/python3.5/lib-dynload',
 '/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages',
 '/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages/Sphinx-1.5.1-py3.5.egg',
 '/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages/setuptools-27.2.0-py3.5.egg',
 '/home/pq/.config/libreoffice/4/user/Scripts/python',
 '/home/pq/.config/libreoffice/4/user/Scripts/python/UnoInsp/UnoInsp/src',
 '/opt/libreoffice5.2/program/python-core-3.5.0/lib/python3.5/site-packages',
 '/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages/IPython/extensions',
 '/home/pq/.ipython']
PYTHONPATHはLibreOfficeのバンドルPythonのものを示しています。
In [4]:
sys.argv[0]
Out[4]:
'/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages/ipykernel/__main__.py'
sys.argv[0]は実行しているスクリプトの名前を返すので、参考にはなりませんでした。
一体sys.executableは何を参照にしているのかソースを読もうとしましたが、LibreOffice5(34)LibreOffice5.2のバンドルPythonで利用可能なモジュール一覧で確認したように、sysモジュールはビルトインモジュールなのでコンパイル前のソースをさがさないといけないのでsysモジュールのソースを読むのは断念しました。
linux - Mismatch between sys.executable and sys.version in Python - Stack Overflow

ここにsys.executableは環境変数PATHで最初に見つかったインタープリターを返すとここに書いてありました。
In [5]:
import os
os.path.expandvars("$PATH")
Out[5]:
'/home/pq/anaconda3/envs/py35/bin:/opt/libreoffice5.2/program:/home/pq/.nvm/versions/node/v7.2.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games'
環境変数PATHを確認するとたしかに、LibreOfficeのバンドルPythonよりもAnacondaのインタープリターへのパスのほうが先に来ています。
ということは、linuxBean14.04(115)pythonコマンドをpipコマンドとともに切り替えるで設定したスクリプトをいじれば解決しそうです、、、

と、思いましたけどよく考えたらJupyter Notebookの起動は、/opt/libreoffice5.2/program/python ~/anaconda3/envs/py35/bin/jupyter notebookでやっているので環境変数は設定していませんので、これを起動するシェルでPATHを変更しても解決しませんでした。

結局いまのところJupyter Notebookがどこで環境変数PATHを設定しているのか、インタープリターが実際はどれなのか、はわかりません。

参考にしたサイト


linux - Mismatch between sys.executable and sys.version in Python - Stack Overflow
sys.executableの戻り値は環境変数PATHを参照にしているようです。

次の関連記事:linuxBean14.04(161)brush-Makefileのバグを修正する

PR

0 件のコメント:

コメントを投稿