529 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
この時にエラーが発生するならば、python3-venvをインストールする。
$ sudo apt install python3-venv
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 : スクリプトのシバンで指定する。
行先頭の Pythonコマンドへのパスを書き換える。
#!/opt/AAAAA/myenv/bin/python
後は普通にPythonプログラムを書けばよい。
方法2 : Webサーバで設定する。
(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;
:
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2025-10-30: 1回 2025-10-29: 6回 2025-10-28: 3回 2025-10-27: 2回 2025-10-26: 2回 2025-10-25: 1回 2025-10-24: 4回