(123) Python仮想環境を作り、Webから使う。

投稿者: | 2024年10月26日

25 views

【1】やりたいこと

/opt/AAAAA に Python仮想環境を作る。
ここに置いた Python環境を Webサーバ経由で使いたい。

【2】Python仮想環境を作る

/opt/AAAAA ディレクトリを作る。

sudo mkdir -p /opt/AAAAA
sudo chown -R $USER:www-data /opt/AAAAA
sudo chmod -R 775 /opt/AAAAA                 # グループに実行権限を付与する。

/opt/AAAAA に Python仮想環境を作る。

cd /opt/AAAAA
python3 -m venv myenv

Python仮想環境をアクティベートする。(=使い始める)

source /opt/AAAAA/myenv/bin/activate

Python仮想環境に必要なパッケージをインストールする。

pip install pyaudio
pip install numpy
pip install SpeechRecognition
pip install openai==1.52
pip install gtts
# などなど

Python仮想環境から脱出する。

deactivate

【3】Webサーバ経由でPython仮想環境を使う

(1) Webサーバーの設定ファイルを編集

nginxの場合

sudo vi /etc/nginx/sites-available/default

以下を server { の中に追記する。

        #-------------------------------------------------------
        # AAAAA を /opt/AAAAA へ飛ばす。
        #-------------------------------------------------------
        # 末尾にスラッシュを追加してリダイレクト
        location /AAAAA {
            return 301 $scheme://$host$uri/;
        }
        # 静的ファイルの処理
        location /AAAAA/ {
            root /opt;
            index index.html index.cgi;
            try_files $uri $uri/ =404;
        }
        #-------------------------------------------------------
        # CGIスクリプトの処理
        location ~ ^/AAAAA/.*\.cgi$ {
            root /opt;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass unix:/run/fcgiwrap.socket;
            fastcgi_param SCRIPT_FILENAME /opt/$fastcgi_script_name;
        }
        #-------------------------------------------------------

設定変更後は Webサーバを再起動する。

sudo systemctl restart nginx
sudo systemctl status nginx

(2) Webブラウザから仮想環境を指定してPythonプログラムを起動

cgiファイルの中で、仮想環境を指定してPythonプログラムを実行する。

#!/usr/bin/python
import subprocess
import os
import time

print("Content-type: text/html\n\n")

print("""
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test2.cgi</title>
</head>
<body>
""")

# 仮想環境のPythonを指定
# これで source /opt/AAAAA/myenv/bin/activate も実行したことになる。
venv_path = '/opt/AAAAA/bin/python'

# 実行するPythonスクリプトのパス
script_path = "/opt/AAAAA/my_program.py"

try:
    # subprocess.Popenを使用して非同期で実行
    process = subprocess.Popen([venv_path, script_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    
    # Webページを先に表示し、処理中であることを知らせるメッセージを表示
    print("<p>スクリプトを実行中です。しばらくお待ちください...</p>")
    
    # スクリプトの結果が出るまで待機
    time.sleep(2)  # 擬似的な待機時間
    stdout, stderr = process.communicate()  # プロセスが終了するまで結果を取得
    
    # 結果を表示
    if stdout:
        print(f"<pre>{stdout}</pre>")
    if stderr:
        print(f"<pre>Error: {stderr}</pre>")
    
except Exception as e:
    print(f"<p>Error: {e}</p>")

print("""
</body>
</html>
""")

★注意★
/opt/AAAAA 配下のファイルは、nginxの実行ユーザー(デフォルトは www-data)がアクセスできるようにグループ設定しておくこと。

sudo chown -R $USER:www-data /opt/AAAAA

nginxの実行ユーザーは、以下のファイルの先頭に書かれている。

less /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
 :

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です