Pythonの仮想環境作成例

ここではデータベースへの接続を行うCGIプログラムを例として、Pythonの仮想環境(venv)の利用方法を説明します。

Pythonの仮想環境は、pip 等によるPythonパッケージのインストールをアプリ―ケーションごとに独立して管理することで、
別々のPythonアプリケーションで異なるバージョンのパッケージが必要な場合でも対応できるようになります。
仮想環境は、venvpipenvpoetry といったパッケージ管理ツールで作成することができます。

お客様ディレクトリ内に単一のPythonパッケージ管理環境を用意する際には、venv 等の仮想環境を使用しなくても

 $ pip install mysql-connector-python --user

のように「--user」オプションを追加することで、ホームディレクトリ直下の「.local」ディレクトリに mysql-connector モジュールをインストールすることができます。
しかし、あるアプリケーションでは mysql-connector のバージョン 1.2 が、別のアプリケーションではバージョン 2.0 が必要といった場合には、venv でアプリケーション毎に個別の仮想環境を用意しないと難しい場合があります。

下記の手順では、Python 3.8 と 標準ライブラリに含まれる venv を使用したプログラムの設置方法を説明します。
サンプルプログラムとして、MySQL データベースに接続し、データを取得する例を掲載しています。
また、以後の文章では次のような情報として説明いたしますので、適宜お客様の情報に置き換えてください。

プログラムの設置先パス  /home/11/abc1200/python-db.example.que.jp
MySQL
ホスト名  dbX.inetd.co.jp
データベース名  db0Xabc1200
ユーザ名  db0Xabc1200
パスワード  password
動作確認用テーブル名  check_table










手順の大きな流れは次のようになります。

仮想環境の作成

1. SSHで当社サーバにログイン後、プログラムの設置先に移動します。

 $ cd /home/11/abc1200/python-db.example.que.jp/python-db.example.que.jp/

※ プログラムの設置先はあらかじめコントロールパネルから仮想ホストとして追加しておく必要があります。
コントロールパネルの「web設定」→「仮想ホストの追加」で設定可能

2. 使用したいバージョン(この例では 3.8)のPythonコマンドを使用して venv の仮想環境を作成します。

 $ /usr/local/bin/python3.8 -m venv /home/11/abc1200/python-db.example.que.jp/.venv

※ 「 /home/11/abc1200/python-db.example.que.jp/python-db.example.que.jp/.venv/ 」ディレクトリが作成され、
仮想環境関連のファイルが生成されます。

パッケージのインストール

3. シェルとして bash(または zsh)を使用していることを確認し、作成した仮想環境をシェルに反映します。

 $ source /home/11/abc1200/python-db.example.que.jp/.venv/bin/activate

※ デフォルトで使用するシェルはコントロールパネルから変更できます。詳しくはこちらのページをご覧ください。
※ 他のシェルを使用している場合でも、「bash」コマンドを実行することで上記の手順を進めることができます。

4. サンプルプログラムの実行に必要なパッケージを仮想環境にインストールします。

 (.venv) $ pip install SQLAlchemy mysql-connector-python

※ シェルに「 (.venv) 」と表示されている状態で pip コマンドを実行する必要があります。

プログラムの設置と動作確認

5. サンプルプログラム「 /home/11/abc1200/python-db.example.que.jp/python-db.example.que.jp/index.cgi 」を以下の内容で作成します。

 #!/home/11/abc1200/python-db.example.que.jp/.venv/bin/python
 # -*- coding: utf-8 -*-

 import cgi
 import urllib
 import sqlalchemy as sa
 import sqlalchemy.orm as orm

 from sqlalchemy.ext.declarative import declarative_base


 db_info = {
     "dialect": "mysql",
     "driver": "mysqlconnector",
     "username": "db0Xabc1200",
     "database": "db0Xabc1200",
     "password": "password",
     "host": "dbX.inetd.co.jp",
     "query": "?charset=utf8",
 }

 Base = declarative_base()


 def print_table(results: list, table_name: str = ""):
     """テーブル内容の表示"""
     print('<table border="1" cellpadding="5" style="margin: 5px;">')
     if table_name:
         print("<caption>" + table_name + "</caption>")
     for row in results:
         print("<tr>")
         for col in row:
             print("<td>" + str(col) + "</td>")
         print("</tr>")
     print("</table>")

 def main():
     print("Content-Type: text/html; charset=utf-8¥n")

     # データベースエンジンの作成
     engine = sa.create_engine(
         "{dialect}+{driver}://{username}:{password}@{host}/{database}{query}".format(
             **db_info
         )
     )
     if engine is None:
         print("ERROR: データベースエンジンの作成に失敗しました<br>")
         return

     Session = orm.sessionmaker(engine)
     with Session() as sess:
         # データベースへの接続確認
         try:
             sess.connection()
         except:
             print("ERROR: データベースへの接続に失敗しました<br>")
             return
         else:
             print("INFO: データベースに接続しました<br>")

         # check_table テーブルの取得
         try:
             results = sess.execute("SELECT * FROM check_table")
         except:
             print("ERROR: check_table テーブルの取得に失敗しました<br>")
             return
         else:
             print_table([tuple(results.keys())] + list(results), "check_table")


 if __name__ == "__main__":
     main()

※ 青字の情報は適宜お客様の情報に置き換えてください。
※ 1行目の「 #!/home/11/abc1200/python-db.example.que.jp/.venv/bin/python 」で実行するPythonのパスを指定できます。

6. ブラウザでプログラムの設置先 python-db.example.que.jp にアクセスし、テーブルの内容が正しく表示されることを確認します。

check_table

注意事項
  • サンプルプログラムが正しく動作するには、仮想環境 .venv の作成と、index.cgi ファイルが「 /home/11/abc1200/python-db.example.que.jp/python-db.example.que.jp/ 」ディレクトリに設置されている必要があります。

   /home/11/abc1200/python-db.example.que.jp/python-db.example.que.jp/
      ┣ .venv/
      ┃   ┣ bin/
      ┃   ┃   ┣ activate
      ┃   ┃   ┣ pip

      ┃   ┃   ┗ python
      ┃   ┗ ...
      ┗ index.cgi

  • 「 ERROR: データベースへの接続に失敗しました 」と表示される場合は、青字で示されたデータベースの認証情報が正しいか確認してください。
  • ERROR: check_table テーブルの取得に失敗しました 」と表示される場合は、データベース内に check_table テーブルが存在していることを確認してください。
  • index.py ファイルでCGIを動作させたい場合、「 /home/11/abc1200/python-db.example.que.jp/python-db.example.que.jp/.htaccess 」ファイルを以下の内容で作成します。index.cgi ファイルでCGIを動作させたい場合、こちらの設定は不要です。

     AddHandler cgi-script .py
     DirectoryIndex index.py
     RedirectMatch 403 /¥.