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;
: