質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

5600閲覧

CGIサーバーで動作するPythonのimportエラー

flask_user

総合スコア4

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/02/16 09:47

前提・実現したいこと

site-packagesにインストールされたライブラリをimportしたpythonコード(FLASKを利用)を
CGIサーバーで実行したいと考えています。

環境

エックスサーバー
Python 3.7.6
Flask 1.1.1:WEBアプリケーションフレームワーク
Linuxbrew:パッケージ管理システム:

発生している問題・エラーメッセージ

site-packagesにインストールされたライブラリをimportしないときは、
ブラウザでアクセスしたときに意図した画面が表示されます。

site-packagesにインストールされたライブラリをimportするときは、
ブラウザでアクセスしたとき、500 internal server errorとなります。

該当のソースコード

index.cgi

index.cgi

1#!/home/□□/.linuxbrew/bin/python3 2from wsgiref.handlers import CGIHandler 3from test import app 4CGIHandler().run(app)

test.py

test.py

1# coding: utf-8 2from flask import Flask 3import 〇〇 4 5app = Flask(__name__) 6 7@app.route("/") 8def hello_world(): 9 return "Hello, World!"

試したこと

以下は仮想環境上で実施

####(1)意図したライブラリがインストールされていることを確認

pip3 freeze

####(2)意図したpythonが使用されていることを確認

python3 -v

####(3)ライブラリにパスが通っていることを確認
(3-1)コンソールを起動

python3 -v

(3-2)パスを確認

import sys print(sys.path)

疑っているが、確認方法がわからないこと

CGIで起動したpythonコードからライブラリが見えていない
ただし、上記の(3-2)で絶対パスが合っていることは確認

補足情報

以下のサイトの手順で環境を構築しました。
https://datacoach.me/data/engineering/xserver-python-flask-env/
https://qiita.com/n-Taro/items/b50ebe49cacda7327aa2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/02/16 10:48

> CGIで起動したpythonコードからライブラリが見えていない 恐らく質問者さんのご想像のとおりimportでエラー(例外)が起きているのだと思いますが、 (XSERVERのエラーログに何か出力されているかもしれません) > CGIで起動したpythonコードからライブラリが見えていない > ただし、上記の(3-2)で絶対パスが合っていることは確認 ならば、FlaskのCGIでimport sys ... print(sys.path) 相当を実行した場合、つまりブラウザに出力されるようにして、どのようになるか確認されてはどうでしょうか。import 〇〇をせずに、です。(Flaskは分からないのとXSERVERの確認はできませんので、コメントのみ、です)
flask_user

2020/02/17 15:25

ありがとうございます。 XSERVERのエラーログには「End of script output before headers: index.cgi」と出力されていました。 importでこのエラーが出る理由がよくわかりません。 import sysだけであれば、import 〇〇としないときと同様に、ブラウザでアクセスしたときに意図した画面が表示されました。 import sys ... print(sys.path)としたときは、import 〇〇としたときと同様に、ブラウザでアクセスしたとき、500 internal server errorとなりました。
dodox86

2020/02/17 15:49

> importでこのエラーが出る理由がよくわかりません。 CGIで最低限出力されるべきヘッダー部 "Content-Type: ...." が出力される前に終わってしまっているのだと思います。だから、“ヘッダーの前にスクリプト終了”「End of script output before headers: index.cgi」と出ます。 print(sys.path) でエラーが起きてるようですね。sys.pathが読めない(sysモジュールが使えなくなっている?)とか。
flask_user

2020/02/17 15:55

ありがとうございます。 環境が壊れている可能性がありますね。 調べてみます。
dodox86

2020/02/17 15:56

そうですね。標準のsysが使えないのはおかしいので、ご想像のとおり、site-packagesの導入でCGI実行時の環境が壊れてしまったような気がします。
guest

回答1

0

私も同様の現象がありました。
具体的にはnumpyをインポートした際に起こり、
原因はnumpyのマルチスレッドで、エックスサーバー上でCGIプログラムが停止したためでした。
貴方のインポートしたいライブラリが何か分かりませんが、私の場合下記方法で解決しましたので参考にしてください。

index.cgiに下記を追記し、マルチスレッドを無効化。

import os
os.environ['OPENBLAS_NUM_THREADS'] = "1"

import numpy をプログラムの頭でなく関数内に書く
test.pyで言うと次の様にします

test.py

1# coding: utf-8 2from flask import Flask 3 4app = Flask(__name__) 5 6@app.route("/") 7def hello_world(): 8 import numpy 9 return "hello"

投稿2020/04/10 04:31

mizu_guchi

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問