Python
pyenv
python3
linuxbrew
xserver

linuxbrewでエックスサーバーにPythonを導入した話

目的はエックスサーバーへのPythonを導入だ。しかし、Pyenvでインストールしようとしても管理者権限がなく断念。代わりにlinuxbrewからPythonをインストールした。

Pythonインストールの目的

Wordpressにpythonのスクレイピングスクリプトが仕込めないか確認したい。「外部からSSH接続してMySQLに接続する」パターンも検討したが、外部接続する理由に乏しくNG(むしろ負担が重い)。極力、エックスサーバー内で完結したい。

前提

方針

エックスサーバーでPythonスクリプトが動くかテスト

エックスサーバーでPythonのスクリプトが動くかどうか確かめたい。ただ、ローカル環境で導入していたPython3.6.2をサーバー上でinstallしようとするとエラーが発生。ネットの各記事を参照しlinuxbrewやgitをinstallしたが、エラーの内容は変わらない。具体的には、OpenSSL libはどこだ?と聞かれる訳だが、/etcの認証が弾かれることが原因だと思われる。多分。管理者権限がないことが原因の模様。

エックスサーバーではPyenvでPythonがインストールできない問題

ネット上の各記事を参照しPyenvを使ってエックスサーバーにPythonをインストールしようとしたが断念した。この章はその試行錯誤の記録である。

目的は、エックスサーバーでPythonスクリプトが動くかどうかのテストだ。エックスサーバーへの接続方法は以下の記事を参照してほしい。
http://vdeep.net/xserver-ssh
https://qiita.com/ShimantoAkira/items/37d09aca38d9e46ddd9a

準備ができたら、以下をシェルスクリプトで入力しエックスサーバーにSSH接続。

ssh xsrv

まずはgitを入れる必要がある模様。ただし、gitは依存ライブラリが無いとインストールできないので、まずは依存ライブラリをインストールする必要がある。以下のページを参考に、「gettext」と「curl」を導入(疲れた…)。
http://vdeep.net/xserver-git

しかし、gitをインストールしようとすると、

The Python ssl extension was not compiled. Missing the OpenSSL lib?

と怒られる。色々やったけど無理だったので、Linuxbrewをインストールしてやり直すことにした。こちらの方が何かとインストールしやすい。で、同じところまで行ったんだけど、同じエラーが出てしまう。githubのページに解決策が記載してあるので試す(もちろんPythonのバージョン名は適宜変更)。
https://github.com/pyenv/pyenv/wiki/Common-build-problems

CFLAGS="-I$(brew --prefix openssl)/include" \
LDFLAGS="-L$(brew --prefix openssl)/lib" \
pyenv install -v 3.4.3

しかし、やはり同じエラーが出てくる。むしろパーミッションが拒否されていることが原因?

Last 10 log lines:
File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 646, in _load_unlocked
File "<frozen importlib._bootstrap>", line 616, in _load_backward_compatible
File "/tmp/tmpfgpubifu/pip-9.0.1-py2.py3-none-any.whl/pip/_vendor/distro.py", line 1050, in <module>
_distro = LinuxDistribution()
File "/tmp/tmpfgpubifu/pip-9.0.1-py2.py3-none-any.whl/pip/_vendor/distro.py", line 595, in __init__
self._distro_release_info = self._get_distro_release_info()
File "/tmp/tmpfgpubifu/pip-9.0.1-py2.py3-none-any.whl/pip/_vendor/distro.py", line 984, in _get_distro_release_info
basenames = os.listdir(_UNIXCONFDIR)
PermissionError: [Errno 13] Permission denied: '/etc'

以下のページを見ると、
"/etcへのアクセス権がなく、pipを使うとpipの中のos.listdir(_UNIXCONFDIR)で失敗します"
と記載があるので、そもそもPythonインストールの時点で100%つまずくんじゃね?って感じがする(しかし記事の掲載を見るとpyenvで問題なくPythonがインストールできているようだ…)。
https://qiita.com/ShimantoAkira/items/37d09aca38d9e46ddd9a

こっちのページで行けそう?(ダメだった)
https://github.com/pyenv/pyenv/issues/993

やっぱ/etcへのアクセス権がないことが原因っぽい。あれ、違う原因かと思ってたけどdistro.pyを修正するのは同じなので試してみる。
http://blog.saboh.net/anaconda_pip_install_error/

てかそもそもPythonがインストールされてないから修正できないのか(distro.pyというファイルがないから)。詰んだ…周囲はどうやってエックスサーバーにPythonをインストールしてるんだ?というかそもそもPythonのインストールにはgitが必要なのに、gitをインストールしていなかった。そのため、

brew install git

でgitをインストール。

ここで断念。

linuxbrewでPythonをインストール

代わりにlinuxbrewからPythonをインストールしたところ、無事インストールできた。

brew install python3

で、すかさずPython3を使用してアップロードしたスクレイピング用ファイルを作動させるために、pip installで必要なライブラリをインストールする(具体的にはBeautifulSoup、requests、htmlをインストール)。

pip install <ライブラリ名>

が、モジュールがないと怒られる。

ModuleNotFoundError: No module named 'requests'

ああpip3だったかと思いpip3でinstall

pip3 install <ライブラリ名>

これで解決。