linuxBean14.04(38)LibreOfficeバンドルPythonにパッケージを追加

前の関連記事:linuxBean14.04(37)失敗したLibreOfficeSDKの例を再make:その4


linuxBean(12)PyCharm4のインストールのPyCharmでProject InterpreterをLibreOfficeのバンドルPythonを指定すると「Install packaging tools」が機能しませんでした。pipのインストールができずパッケージを追加できないと思っていましたが、システムPythonのパスを通すことで間接的にパッケージの追加ができました。

LibreOfficeのバンドルPythonにはpipをインストールできない


How can I use python requests or other 3rd party packages in general? - Ask LibreOffice

この最初の回答にLibreOfficeのバンドルPythonにPythonパッケージを追加する方法のQ&Aが書いてあります。

linuxBean14.04のシステムPythonは3.4なのですでにpipが付属しているそうですが、LibreOffice5.0.0.0beta1のバンドルPythonは3.3.5なのでpipが付属していません。

バンドルPythonにpipがインストールできれば話は簡単です。

しかしlinuxBean(12)PyCharm4のインストールでやったようにPyCharmの「Install packaging tools」ではインストールできませんでした。

そこでInstallation — pip 7.0.3 documentationにあるget-pip.pyを使ってみることにしました。

書いてある通りget-pip.pyをダウンロードしてそのフォルダからバンドルPythonで実行してみました。
pq@pq-VirtualBox:~$ sudo /opt/libreofficedev5.0/program/python get-pip.py
The directory '/home/pq/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/pq/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting pip
  Downloading pip-7.0.3-py2.py3-none-any.whl (1.1MB)
    100% |████████████████████████████████| 1.1MB 382kB/s 
Collecting setuptools
  Downloading setuptools-18.0.1-py2.py3-none-any.whl (461kB)
    100% |████████████████████████████████| 462kB 713kB/s 
Collecting wheel
  Downloading wheel-0.24.0-py2.py3-none-any.whl (63kB)
    100% |████████████████████████████████| 65kB 1.7MB/s 
Installing collected packages: pip, setuptools, wheel
Exception:
Traceback (most recent call last):
  File "/opt/libreofficedev5.0/program/python-core-3.3.3/lib/distutils/sysconfig.py", line 444, in _init_posix
    parse_makefile(filename, g)
  File "/opt/libreofficedev5.0/program/python-core-3.3.3/lib/distutils/sysconfig.py", line 313, in parse_makefile
    fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1, errors="surrogateescape")
  File "/opt/libreofficedev5.0/program/python-core-3.3.3/lib/distutils/text_file.py", line 100, in __init__
    self.open(filename)
  File "/opt/libreofficedev5.0/program/python-core-3.3.3/lib/distutils/text_file.py", line 115, in open
    self.file = io.open(self.filename, 'r', errors=self.errors)
FileNotFoundError: [Errno 2] No such file or directory: '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python3.3/config-3.3m/Makefile'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/tmp/tmppem1ou/pip.zip/pip/basecommand.py", line 223, in main
    status = self.run(options, args)
  File "/tmp/tmppem1ou/pip.zip/pip/commands/install.py", line 297, in run
    root=options.root_path,
  File "/tmp/tmppem1ou/pip.zip/pip/req/req_set.py", line 622, in install
    **kwargs
  File "/tmp/tmppem1ou/pip.zip/pip/req/req_install.py", line 808, in install
    self.move_wheel_files(self.source_dir, root=root)
  File "/tmp/tmppem1ou/pip.zip/pip/req/req_install.py", line 1003, in move_wheel_files
    isolated=self.isolated,
  File "/tmp/tmppem1ou/pip.zip/pip/wheel.py", line 242, in move_wheel_files
    name, user=user, home=home, root=root, isolated=isolated
  File "/tmp/tmppem1ou/pip.zip/pip/locations.py", line 190, in distutils_scheme
    i.finalize_options()
  File "/opt/libreofficedev5.0/program/python-core-3.3.3/lib/distutils/command/install.py", line 313, in finalize_options
    (prefix, exec_prefix) = get_config_vars('prefix', 'exec_prefix')
  File "/opt/libreofficedev5.0/program/python-core-3.3.3/lib/distutils/sysconfig.py", line 537, in get_config_vars
    func()
  File "/opt/libreofficedev5.0/program/python-core-3.3.3/lib/distutils/sysconfig.py", line 450, in _init_posix
    raise DistutilsPlatformError(my_msg)
distutils.errors.DistutilsPlatformError: invalid Python installation: unable to open /opt/libreofficedev5.0/program/python-core-3.3.3/lib/python3.3/config-3.3m/Makefile (No such file or directory)
だめです。

/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python3.3/config-3.3m/Makefileが存在しないといわれてインストールできません。

あとでインストールしたシステムPython3.3.6には/usr/lib/python3.3/config-3.3m-i386-linux-gnu/Makefileがついていたので、LibreOfficeのバンドルPythonではこのMakefileが付属していないのが原因でpipがインストールできないようです。

システムPython3.3をインストールしてそのsys.path一覧sites.pthファイルを作成


バンドルPythonにpipをインストールすることはあきらめて紹介されているもう一つの方法を使うことにしました。

まずはバンドルPythonと同じバージョンのシステムPythonをインストールします。

Old and New Python Versions : Felix KrullのPPAを使いました。

Synapticパッケージマネージャで以下のリポジトリを登録しました。

deb http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu trusty main

リポジトリの内容の取得にはlinuxBean設定ウィザードで公開鍵の取得が必要でした。

「再読込」後Python3.3で検索すると3.3.6がでてきました。


python3.3-completeをインストール指定してインストールしました。

実行ファイルは/usr/bin/python3.3にインストールされました。

ライブラリ等は/usr/lib/python3.3にインストールされていました。

TerminalでこのシステムPython3.3のパスを調べます。

/usr/bin/python3.3
import sys
sys.path
を実行します。
pq@pq-VirtualBox:~$ /usr/bin/python3.3
Python 3.3.6 (default, Jan 28 2015, 17:35:40) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python3.3', '/usr/lib/python3.3/plat-i386-linux-gnu', '/usr/lib/python3.3/lib-dynload', '/usr/local/lib/python3.3/dist-packages', '/usr/lib/python3/dist-packages']
>>> 
豆ボタン→アクセサリ→Leafpad。

このパス一覧を1行ずつ入力します。

順番を入れ替えてしまうとあとで苦労します。(linuxBean14.04(44)Pythonモジュールのインポートエラーに悩まされる参照。)
/usr/lib/python3.3
/usr/lib/python3.3/plat-i386-linux-gnu
/usr/lib/python3.3/lib-dynload
/usr/local/lib/python3.3/dist-packages
/usr/lib/python3/dist-packages
このパス一覧をLeafpadに入力し拡張子pthのファイル名(今回はsites.pthにしました)で保存します。

ここでつまづいたのはこのsites.pthをどこに保存するかです。

28.13. site — サイト固有の設定フック — Python 3.3.6 ドキュメントを読むと、このpthファイルはlib/site-packages(Windowsの場合)、lib/site-python(UNIXとMacOSの場合)、lib/pythonX.Y/site-packagesのいずれかのフォルダに置いておくと、sys.pathにそれに書いてあるパスが追加されると書いてあります。

LibreOfficeのバンドルPythonではこれらに一致するフォルダがなかったため、/opt/libreofficedev5.0/program/python-core-3.3.3/lib/site-packagesにpthファイルを置いてみました。

/opt/libreofficedev5.0/program/python /opt/libreofficedev5.0/program/python-core-3.3.3/lib/site.py

このようにsite.pyを実行するとバンドルPythonのsys.pathが確認できます。
pq@pq-VirtualBox:~$ /opt/libreofficedev5.0/program/python /opt/libreofficedev5.0/program/python-core-3.3.3/lib/site.py
sys.path = [
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib',
    '/opt/libreofficedev5.0/program',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/lib-dynload',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/lib-tk',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/site-packages',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python33.zip',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python3.3',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python3.3/plat-linux',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python3.3/lib-dynload',
]
USER_BASE: '/home/pq/.local' (exists)
USER_SITE: '/home/pq/.local/lib/python3.3/site-packages' (doesn't exist)
ENABLE_USER_SITE: True
ダメです。sites.pthの内容が全く反映されていません。

site.pyを「pth」で検索して読んでみると、pthファイルは201行目で読み込まれており、185行目から始まる関数addsitedir()でパスの追加が行われていることがわかりました。

今度はaddsitedirで検索してみると281行目と328行目で読み込まれていることがわかりました。

lib/site-packagesに置いたpthファイルは328行目で読み込まれてもよさそうでしたので、PyCharmでデバッグしてステップ実行してみたところ、パス区切りが「/」のOSではlib/site-packagesは無視され、lib/pythonX.Y/site-packagesがパッケージフォルダとして認識されることがわかりました。(全くドキュメントに書いてある通りです。)
        if sys.platform in ('os2emx', 'riscos'):
            sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
        elif os.sep == '/':
            sitepackages.append(os.path.join(prefix, "lib",
                                        "python" + sys.version[:3],
                                        "site-packages"))
            sitepackages.append(os.path.join(prefix, "lib", "site-python"))
        else:
            sitepackages.append(prefix)
            sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
バンドルPythonでは/opt/libreofficedev5.0/program/python-core-3.3.3/lib/site-packagesはsite.pyを実行する前からsys.pathに含まれているものでした。

sites.pthを~/.local/lib/python3.3/site-packagesに置くとシステムPythonのパッケージがみえる


USER_SITEの/home/pq/.local/lib/python3.3/site-packagesを作成してそこにsites.pthを置くことにしました。(/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python3.3/site-packagesに置いても同じ結果ですがrootでの作業が必要ですし、同じPython3.3を使っている他のバージョンのLibreOfficeのバンドルPythonには反映されません。)

mkdir -p ~/.local/lib/python3.3/site-packages

フォルダがなければこのコマンドで作成できます。

PyCharmを起動してsettingsパネルでProject InterpreterをみてみるとシステムPythonのパッケージが読み込まれていました。


「Install packaging tools」をクリックするとpipなどがインストールされることを期待しましたがダメでした。(これもこの記事の最初にやったとおりバンドルPythonにpipがインストールできなかったので当然の結果です。)
pq@pq-VirtualBox:~$ /opt/libreofficedev5.0/program/python /opt/libreofficedev5.0/program/python-core-3.3.3/lib/site.py
sys.path = [
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib',
    '/opt/libreofficedev5.0/program',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/lib-dynload',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/lib-tk',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/site-packages',
    '/home/pq/.config/libreofficedev/4/user/Scripts/python',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python33.zip',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python3.3',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python3.3/plat-linux',
    '/opt/libreofficedev5.0/program/python-core-3.3.3/lib/python3.3/lib-dynload',
    '/home/pq/.local/lib/python3.3/site-packages',
    '/usr/lib/python3.3',
    '/usr/lib/python3.3/plat-i386-linux-gnu',
    '/usr/lib/python3.3/lib-dynload',
    '/usr/local/lib/python3.3/dist-packages',
    '/usr/lib/python3/dist-packages',
]
USER_BASE: '/home/pq/.local' (exists)
USER_SITE: '/home/pq/.local/lib/python3.3/site-packages' (exists)
ENABLE_USER_SITE: True<
site.pyを実行するとシステムPythonのパスがsys.pathに追加されていることがわかります。

これでシステムPythonのすべてのモジュールがバンドルPythonで使用可能になったわけではなく、sqlite3はimportできませんでした。(_sqlite3がないといわれました。)

参考にしたサイト


How can I use python requests or other 3rd party packages in general? - Ask LibreOffice
最初の回答にpthファイルを使う方法を教えてもらいました。

Installation — pip 7.0.3 documentation
LibreOfficeのバンドルPythonにはget-pip.pyを使ってもインストールできませんでした。

Old and New Python Versions : Felix Krull
以前のバージョンのPythonを提供しているPPA。

28.13. site — サイト固有の設定フック — Python 3.3.6 ドキュメント
pthファイルを読み込んでsys.pathを設定してくれます。

次の関連記事:linuxBean14.04(39)Pythonのパッケージ管理をPyCharmで行う

PR

0 件のコメント:

コメントを投稿