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

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

ただいまの
回答率

88.03%

Pythonスクリプトをwebサーバ上で実行した際、白画面が表示されてしまう

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 318

前提・実現したいこと

PythonにてCGIスクリプトを記述する練習をしており、
指南書片手にサンプルプログラムを書いているのですが、
指南書に書いてある動作を実現できず困っております。

ブラウザ上のテキストボックスへ任意の文字列を入力した後、
「送信」ボタンを押すと画面が切り替わり、
テキストボックスに入力された文字列を表示する、
という単純な内容です。

※当方、プログラミング初心者につき、単語の理解等不十分なため、
違和感、誤りのある文章となってしまっているかもしれませんが、
何卒ご容赦ください。

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

www
┣test.html
┗cgi-bin
..┗input.py

上記のフォルダの構造でwww上でcmdより
「python -m http.server --cgi 8000」と入力し、サーバを起動。
ブラウザのURL欄に「http://127.0.0.1:8000/test.html」と入力し、
htmlファイルを開き、テキストボックスに「あいうえお」と入力。 
「送信」ボタンをクリックすると画面は切り替わるのですが、
文字列は表示されていない真っ白な画面で、タイトルもコード内で指定した
「受信したデータを表示」ではなく
「http://127.0.0.1:8000/cgi-bin/input.py」と表示されてしまいます。

また、画面遷移したあとにブラウザからinput.pyのソースを確認しようとすると、
cgi-bin>input.pyの階層は認識しているようなのですが、input.pyの中身が空のように見えています。

イメージ説明

該当のソースコード

【test.html】
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="Shift_JIS">
<title>CGIテスト</title>
</head>
<body>
<h1>テキストテスト</h1>
<form action="/cgi-bin/input.py" method="POST">
<p><label>テキスト入力:<input type="text" name="mytext" size="20"></p>
<p><input type="submit" value="送信"></p>
</form>
</body>
</html>

【input.py】
import cgi
import sys
import io

sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='shift_jis')

html_body="""
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="Shift_JIS">
<title>受信したデータを表示</title>
</head>
<body>
<h1>%s</h1>
</body>
</html>
"""
form=cgi.FieldStorage()
s=form.getvalue('mytext','')
print(html_body % s)

試したこと

文字コードの関係かと思い、コード上のShift_JISを
UTF-8に変えてみましたが、改善せず。

実行環境

・Windows10
・Python 3.8

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • PonpokopoNosuke

    2020/10/24 22:01

    はい、純粋にWindows上でのPythonです。
    また、指南書もWindows用になっているかと思います。
    (サンプルコードも「Windowsの場合はこちら」という風に場合分けされているため)

    where python の実行結果は下記のとおりです。

    C:\Users\sonos\Anaconda3\python.exe
    C:\Users\sonos\AppData\Local\Programs\Python\Python38\python.exe
    C:\Users\sonos\AppData\Local\Microsoft\WindowsApps\python.exe

    キャンセル

  • dodox86

    2020/10/24 22:15

    色々と聞いてすみません。
    コマンドプロンプトを開き、www\cgi-bin のディレクトリ上で、input.py と入力して実行したらどうなりますでしょう。「python input.py」ではなく、「input.py」とだけ入力して実行する、という意味です。

    キャンセル

  • PonpokopoNosuke

    2020/10/24 23:02

    とんでもありません、親身になって相談に乗っていただき本当にありがとうございます。「input.py」と入力して、実行するとVisual Studio Code上でinput.pyが開きます。pyファイルを開く規定のプログラムがVSCになっているためかと思われます。

    キャンセル

回答 1

0

質問者さんと同じ環境ではないのですが、同じような問題は再現しましたので、その対策を回答として投稿します。

CGIのPython3スクリプトである「cgi-bin/input.py」は、ファイル自体の文字コードがシフトJISであるまま実行すると、

C:\www>where python
C:\Users\user01\AppData\Local\Microsoft\WindowsApps\python.exe

C:\www>python --version
Python 3.8.6

C:\www>python cgi-bin\input.py
  File "cgi-bin\input.py", line 12
SyntaxError: Non-UTF-8 code starting with '\x8e' in file cgi-bin\input.py on line 13, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details


上記で示したように、エラーとなります。シフトJISの全角文字部分が影響し、スクリプト実行に悪影響をあたえているようです。そのシフトJISのスクリプトの冒頭で、ソースコードの文字コード指定をするとこのエラーを回避することができます。# coding: shift_jisを追加してみてください。

# coding: shift_jis

import cgi
import sys
...続く

ひとつの解決策は、Pythonスクリプトのファイルも、CGIから出力するHTMLも、文字コードをUTF-8に統一することです。こちらの方が最近は一般的です。

import cgi
import sys
import io

# 使わない
#sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='shift_jis')

html_body="""
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>受信したデータを表示</title>
</head>
<body>
<h1>%s</h1>
</body>
</html>
"""
form=cgi.FieldStorage()
s=form.getvalue('mytext','')
print(html_body % s)

これでも解決しない場合は、もしかすると質問者さんお使いのPython実行環境が影響しているかもしれません。質問者さんがwhereコマンドでpythonを実行したときの結果は以下ですが、スクリプト実行時のPython3インタープリターについて、一体どれが動いてしまっているのか。

C:\Users\sonos\Anaconda3\python.exe
C:\Users\sonos\AppData\Local\Programs\Python\Python38\python.exe
C:\Users\sonos\AppData\Local\Microsoft\WindowsApps\python.exe

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/26 15:57

    回答ありがとうございます。ご提示いただいた内容を試してみましたが、改善しませんでした。
    最後に記載いただいたインタープリターが複数ある?件について、インストールしなおす等の方法をとれば改善される可能性があるのでしょうか・・・?

    キャンセル

  • 2020/10/27 02:50 編集

    > インストールしなおす等の方法をとれば改善される可能性があるのでしょうか・・・?

    改善される可能性はありますが、アンインストールならまだしも、インストールし直しでは状況は変わらないかもしれません。先立ってwhereコマンドで確認していただいた質問者さんのPythonですが、3つ入っていて、以下のようなものだと思います。

    C:\Users\sonos\Anaconda3\python.exe ---(1)
    C:\Users\sonos\AppData\Local\Programs\Python\Python38\python.exe ---(2)
    C:\Users\sonos\AppData\Local\Microsoft\WindowsApps\python.exe ---(3)

    (1) AnacondaのPython
    (2) Windows用のインストーラーからインストールしたPython
    (3) MicrosoftストアからインストールしたPython

    私が回答で利用しているPythonは、(3)です。
    (2)または(3)のみにすれば問題の切り分けがし易いですが。

    とりあえず、コマンドプロンプト(cmd)上で www/のディレクトリ下で

    python -m http.server --cgi 8000

    とのようにWEBサーバーを起動していると思いますが、WEBサーバーは起動させず、

    python cgi-bin\input.py

    と入力して実行するとどうなりますか。結果を本コメント欄に貼り付けてもらえますか。

    キャンセル

  • 2020/10/27 10:08

    確認のため、一応下は実行していただきたいですが、

    > python cgi-bin\input.py
    >
    > と入力して実行するとどうなりますか。結果を本コメント欄に貼り付けてもらえますか。

    恐らくですが、「where python」コマンドの実行結果からして、1番最初に出力されるAnacondaのPython3が動いてしまっているのだと思います。

    WEBサーバーを起動する際、www/ディレクトリ下で
    C:\Users\sonos\AppData\Local\Programs\Python\Python38\python.exe -m http.server --cgi 8000
    と起動するか、

    C:\Users\sonos\AppData\Local\Microsoft\WindowsApps\python.exe -m http.server --cgi 8000

    とのように、pythonインタープリターのPATHを絶対PATH指定で実行してみてください。
    それでもダメなら、Anaconda版をアンインストールするとか、サーチPATH(PATH環境変数)の指定を一時的に無効にして試してみてください。

    "http.server"モジュールを利用してのCGIは、それがpythonスクリプトであるならば今、動作させているpythonインタープリターを利用しているようです。
    Windows版であればsubprocessで起動しています。(python3の細かいバージョンは違いますが、以下のソース1185行あたりから:
    https://github.com/python/cpython/blob/master/Lib/http/server.py
    そのため、"もしかしたら" Anaconda版ではダメなのかもしれません。

    いずれにせよ、複数のPython3環境が混在しているのはトラブルのもとなので、自力で解決できないかぎりはあまりお勧めできる環境ではないと思います。

    キャンセル

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

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る