レンタルサーバのロリポップでは、python2系、3系の実行環境が用意されており、pythonのプログラムを実行させることができます。
今回は、pipパッケージが必要なpythonのプログラムを手元の環境で作成/動作確認し、ロリポップのサーバへ転送して実行させる方法を説明します。
ローカルでの作業
まずは、手元の環境で動作するスクリプトを作成します。 今回はmac上で、pythonのrequestsとBeautifulSoupパッケージを利用したスクリプトを作成してみます。
まず、vendorディレクトリを作り、pipでパッケージをインストールします。
mkdir vendor
pip install requests --target ./vendor
pip install beautifulsoup4 --target ./vendor
インストールしたパッケージが、vendorディレクトリに作成されていることを確認します。
$ ls vendor/
beautifulsoup4-4.6.0.dist-info chardet requests-2.19.1.dist-info
bin chardet-3.0.4.dist-info urllib3
bs4 idna urllib3-1.23.dist-info
certifi idna-2.7.dist-info
certifi-2018.4.16.dist-info requests
プログラムを作る
まず、pythonスクリプトを格納する場所を作ります。どこでも良いのですが、今回はsrcディレクトリの下で管理することにします。
mkdir src
次に、src/の下にスクリプトを作成します。 今回はsrc/test.pyの名前でスクリプトを作成しました。
import os
import sys
# vendor以下をスクリプトの読み込みパスに追加
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), '../vendor'))
# 依存パッケージのロード
import requests
from bs4 import BeautifulSoup
# webページを読み込んでtitleタグのテキストを取得
url = 'https://yahoo.co.jp/'
res = requests.post(url)
soup = BeautifulSoup(res.content, 'html.parser')
title = soup.find('title')
# 取得したテキストを出力
print(title.text)
スクリプトは、指定されたサイトにアクセスし、titleタグの中身を出力するものです。ローカルのmac環境で実行し、以下のようにタイトルが取得できることがわかりました。
$ python src/test01.py
Yahoo! JAPAN
作成したプログラムを転送する
スクリプトを作成したら、次は作成したスクリプトをロリポップのサーバへ転送します。
プログラムの開発中はサーバの転送を何回も行うため、作業を簡単にするためにスクリプトを作成しておくと良いです。本番サーバへのプログラムを転送することはデプロイ(deploy)とも呼ばれているため、今回はdeploy.shというファイル名で下記のファイルを作成しました。
サーバ名(xxx.jp-xxxxx@ssh999)や、転送先ディレクトリ(~/web/dest)などは、転送先の環境に合わせて書き換えてください。また、転送先ディレクトリは、あらかじめロリポップのサーバ上に作成しておいてください。
#!/bin/bash
scp -r -P 2222 ./src/ ./vendor/ xxx.jp-xxxxx@ssh999.lolipop.jp:~/web/dest
ファイルを作成したらchmodで実行権限を付与します。
$ chmod 755 deploy.sh
その後、deploy.shを実行します。すると、ログインパスワードの入力待ちになるので、パスワードを入力するとファイルの転送が始まります。(パスワードは、ロリポップの管理画面で確認できます)
$ ./deploy.sh
xxx.jp-xxxxx@ssh999.lolipop.jp's password:
test.py 100% 306 68.5KB/s 00:00
RECORD 100% 1390 270.0KB/s 00:00
WHEEL 100% 110 22.2KB/s 00:00
top_level.txt 100% 5 0.2KB/s 00:00
LICENSE.txt 100% 3947 574.5KB/s 00:00
INSTALLER 100% 4 0.9KB/s 00:00
METADATA 100% 8866 183.6KB/s 00:00
RECORD 100% 6164 243.6KB/s 00:00
metadata.json 100% 1375 218.7KB/s 00:00
...
作成したファイルはtest.pyの1ファイルだけですが、vendorの下にたくさんのファイルがあるため、少し時間がかかります。
転送されたスクリプトをロリポップ上で実行する
転送が終わったら、sshコマンドでロリポップのサーバにログインします。ロリポップでは、sshをポート2222で解放しているため、-p 2222
で指定します。
ssh -p 2222 xxx.jp-xxxxx@ssh999.lolipop.jp
ログインしたら、念のためにpythonコマンドの場所やバージョンを確認しておきます。
[xxx.jp-xxxxx@user888 ~]$ which python
/usr/local/bin/python
[xxx.jp-xxxxx@user888 ~]$ python --version
Python 3.4.1
先ほどの例では~/web/testの下に転送していたため、cdコマンドで移動後にスクリプトを実行します。
[xxx.jp-xxxxx@user888 ~]$ cd ~/web/test
[xxx.jp-xxxxx@user888 test]$ ls
src vendor
[xxx.jp-xxxxx@user888 test]$ python src/test01.py
Yahoo! JAPAN
正しく実行さればOKです。スクリプト上でvendorのディレクトリを指定しているため、pipパッケージも問題なく利用できています。今回作ったスクリプトをcronスクリプトに登録しておくことで、一定時間ごとにコマンド周期を実行することも可能です。
ありがとうございました。
非常に参考になりました。
以下のサイトでpipのlolipopでのインストールの仕方が紹介されていました。参考までに。
hhttps://creepfablic.site/2019/06/10/lolipop-pipcommand/