Pythonの仮想環境作成例
ここではデータベースへの接続を行うCGIプログラムを例として、Pythonの仮想環境(venv)の利用方法を説明します。
Pythonの仮想環境は、pip 等によるPythonパッケージのインストールをアプリ―ケーションごとに独立して管理することで、
別々のPythonアプリケーションで異なるバージョンのパッケージが必要な場合でも対応できるようになります。
仮想環境は、venv や pipenv、poetry といったパッケージ管理ツールで作成することができます。
お客様ディレクトリ内に単一のPythonパッケージ管理環境を用意する際には、venv 等の仮想環境を使用しなくても
のように「--user」オプションを追加することで、ホームディレクトリ直下の「.local」ディレクトリに mysql-connector モジュールをインストールすることができます。
しかし、あるアプリケーションでは mysql-connector のバージョン 1.2 が、別のアプリケーションではバージョン 2.0 が必要といった場合には、venv でアプリケーション毎に個別の仮想環境を用意しないと難しい場合があります。
下記の手順では、Python 3.8 と 標準ライブラリに含まれる venv を使用したプログラムの設置方法を説明します。
サンプルプログラムとして、MySQL データベースに接続し、データを取得する例を掲載しています。
また、以後の文章では次のような情報として説明いたしますので、適宜お客様の情報に置き換えてください。
手順の大きな流れは次のようになります。
Pythonの仮想環境は、pip 等によるPythonパッケージのインストールをアプリ―ケーションごとに独立して管理することで、
別々のPythonアプリケーションで異なるバージョンのパッケージが必要な場合でも対応できるようになります。
仮想環境は、venv や pipenv、poetry といったパッケージ管理ツールで作成することができます。
お客様ディレクトリ内に単一の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で当社サーバにログイン後、プログラムの設置先に移動します。
※ プログラムの設置先はあらかじめコントロールパネルから仮想ホストとして追加しておく必要があります。
コントロールパネルの「web設定」→「仮想ホストの追加」で設定可能
2. 使用したいバージョン(この例では 3.8)のPythonコマンドを使用して venv の仮想環境を作成します。
※ 「 /home/11/abc1200/python-db.example.que.jp/python-db.example.que.jp/.venv/ 」ディレクトリが作成され、
仮想環境関連のファイルが生成されます。
$ 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)を使用していることを確認し、作成した仮想環境をシェルに反映します。
※ デフォルトで使用するシェルはコントロールパネルから変更できます。詳しくはこちらのページをご覧ください。
※ 他のシェルを使用している場合でも、「bash」コマンドを実行することで上記の手順を進めることができます。
4. サンプルプログラムの実行に必要なパッケージを仮想環境にインストールします。
※ シェルに「 (.venv) 」と表示されている状態で pip コマンドを実行する必要があります。
$ 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 」を以下の内容で作成します。
※ 青字の情報は適宜お客様の情報に置き換えてください。
※ 1行目の「 #!/home/11/abc1200/python-db.example.que.jp/.venv/bin/python 」で実行するPythonのパスを指定できます。
6. ブラウザでプログラムの設置先 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
#!/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 にアクセスし、テーブルの内容が正しく表示されることを確認します。
注意事項
- サンプルプログラムが正しく動作するには、仮想環境 .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 /¥.