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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2464閲覧

Pythonを利用して複数行のhtmlコードを出力したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/10/25 04:36

質問の背景と質問者の知識レベル

Webアプリケーションを作りたいと思い、
html, css, js, python, シェルスクリプトあたりを勉強しています(1ヶ月ほど)。

ローカル環境にてhtmlのフォームからPOSTした内容を結果として表示するような挙動を実現したく、
Pythonのformat関数を利用して実装を試みたものの上手くいかず、
検索してみても現状解決できていないため、みなさまのお力をお借りできればと思います。

前提・実現したいこと

Vagrant + VirtualBoxを利用して構築したローカルのWebサーバー上でhtmlフォームからPythonへ値をPOSTし、
その値を反映した複数行のhtmlコードをPythonのformat関数を利用して出力したいです。
作りたいもののイメージは自分のニックネームを入れると、「◯◯さんにおすすめの趣味は××」です、と結果を返してくれる診断アプリのようなものになります。

該当のソースコード

ディレクトリの構造は
index.html
cgiserver.py
cgi-bin
┗result.py

として上で、

python cgiserver.py

を実行しています。
なお各種ソースは下記になります。
参考にした過去の質問、サイトは下記です。
https://teratail.com/questions/95635
https://qiita.com/kento_y/items/fb7944084e410a607679

index.html

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>あなたの趣味診断</title> </head> <body> <h1>あなたの趣味診断</h1> <form method="POST" action="cgi-bin/result.py"> <label for="name">ニックネーム</label> <input name="name" type="text" id="name"> <button type="submit">診断する</button> </form> </body> <footer> </footer> </html>

reslut.py

#!/usr/bin/python3 # -*- coding: utf-8 -*- import cgi html_format = """ <html lang="ja"> <head> <meta http-equiv="Content-Type" content=\"text/html\"; charset="UTF-8\" /> </head> <body> {}さんの趣味は </body> </html> """ form = cgi.FieldStorage() name = form.getvalue("name") print("Content-Type: text/html; charset=UTF-8") print("") html = html_format.format(name) print(html)

cgiserver.py

# -*- coding: utf-8 -*- import http.server http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler)

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

上記を実行した際に、ターミナルに

192.168.33.1 - - [22/Oct/2020 21:20:54] "POST /cgi-bin/result.py HTTP/1.1" 200 - Traceback (most recent call last): File "/home/vagrant/.pyenv/versions/3.5.2/lib/python3.5/http/server.py", line 1135, in run_cgi os.execve(scriptfile, args, env) FileNotFoundError: [Errno 2] No such file or directory: '/home/vagrant/syumi/cgi-bin/result.py' 192.168.33.1 - - [22/Oct/2020 21:20:54] CGI script exit status 0x7f00

とメッセージが表示され、ブラウザでは真っ白のページが表示されます。

試したこと

result.pyの内容を下記に変更した場合は問題なく入力した値が表示されているため、ディレクトリやファイルがない、というわけではないのではと思っています。

#!/usr/bin/python # -*- coding: utf-8 -*- import cgi import cgitb import sys cgitb.enable() form = cgi.FieldStorage() print("Content-Type: text/html; charset=UTF-8") print("") if "name" not in form: print("<h1>Error!</h1>") print("<br>") print("テキストを入力してください!") print("<a href='/'><button type='submit'>戻る</button></a>") sys.exit() text = form.getvalue("name") print(text)

また参考にした過去の質問では今回のresult.pyに当たるファイルの拡張子が「.cgi」だったので、result.cgiとして各パスなども修正したものの同じ結果でした。

補足情報

Pythonは3.5.2を利用しています。

何卒よろしくお願いいたします!

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

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

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

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

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

dodox86

2020/10/25 05:28

> FileNotFoundError: [Errno 2] No such file or directory: '/home/vagrant/syumi/cgi-bin/result.py' とエラーが出ているのでこれ以外に原因は考えられないのですが、「python cgiserver.py」を実行した時点のターミナル上で確認したとき、/home/vagrant/syumi/cgi-bin/result.py は確実に存在しているのでしょうか。ファイルのパーミッションなども併せて確認してください。(パーミッションが不適切な場合は、違うエラーになりそうですけど)
退会済みユーザー

退会済みユーザー

2020/10/25 05:55 編集

前回のご質問から続けてご覧いただきありがとうございます! まず前回dodox86さんにご回答いただいたことでモチベーションを失わず、楽しくpython勉強できています!ありがとうございました! そして今回の件ですが、結果的にdodox86さんの指摘事項に回答すべく一連確認をしていたところ、 無事解決いたしました。 誤っていたのはシェバンの部分で、chmodやディレクトリ構造などは合っていたのですが、 念のため、と検証していた際に動作確認ができていた下記のコードのシェバンの部分を#!/usr/bin/python3にしたところ(修正ミスであり、意図せず偶然です)、同様のエラーが見られました(#!/usr/bin/pythonにすると元に戻ります) そこで少しPython3のシェバン周りを調べてみたところ、#!/usr/bin/python3ではなく、#!/usr/bin/env python3としている方がいて、 もしかしてと試したところ無事挙動が確認できました。 なので元々気になっていた部分とは異なるのですが、このようなシェバンの記法はPython3としての決まり事なのか、 それとも環境によって異なるのかどうなのだろうと気になり出しました・・・ (python3ではなくpythonとした際には動いていたので余計に気になり) ともあれご指摘いただいた内容を検証している中で無事解決することができました! 前回に引き続き誠にありがとうございます!今後ともお力添えいただけますと幸いです!
dodox86

2020/10/25 06:02

> このようなシェバンの記法はPython3としての決まり事なのか、 > それとも環境によって異なるのかどうなのだろうと気になり出しました・・・ Python3特有といいますかRubyなど他のスクリプト言語でもそのように記述することはあって、同じPythonでも複数のバージョンを使い分けたりする場合にその時々の適切なバージョンの(インストールされている位置の)ものを自動的に選択するときに/usr/bin/env を使います。要は、環境や運用形態によって異なることになります。/usr/bin/python3 などと指定するのは、/usr/bin/python3 を必ず使うという指定で、envだとその時々で(設定如何)で変わります。ですので、どちらもアリです。/usr/bin/env について別途調べてみるとよいと思います。 解決されたのであれば、説明とともに自己解決で質問を閉じて良いと思いますのでよろしくお願いします。
dodox86

2020/10/25 06:10

ともあれご自身で原因を突きとめ、解決できたのは何よりだったと思います。モチベーションを失わず、引き続き楽しく勉強を進めてください。
otn

2020/10/25 13:32

/usr/bin/python3 が存在しないと言うことだと思います。 シェバン行には実行するプログラムのファイル名のフルパスを書くので、存在することを確認していないファイル名を書いてはいけません。 /usr/bin/env python3 は、環境変数PATHに書かれたディレクトリー群からpython3というファイルを探してそれを実行するので、環境変数PATHの内容に依存して実行されるプログラムが決まります。従って実行時点に於けるPATHの内容を把握していないと使えない(=問題が発生し得る)機能です。
退会済みユーザー

退会済みユーザー

2020/10/27 00:13

>dodox86さん こちら丁寧にお教えいただき誠にありがとうございます!(そして回答が遅くなってしまいすみません!) これからも学習を進めていく中で調べてもわからないことはteratailで質問させていただいただければと思いますので、 もしよろしければまた色々とご回答いただけますと幸いです! >otnさん 回答ありがとうございます!! 環境変数もそうですがシェルスクリプト(Unix?)で触れる領域に関しては 「おまじない」で済ませてしまっている部分も多々あり、今回はそれが問題につながったと思ってますので、 これを機に学習してみようと思います!ありがとうございます!
guest

回答1

0

ベストアンサー

こちらシェバン部分の記載が問題でした。
「usr/bin/python3」と記載していた部分を「usr/bin/env python3」としたところ、無事動作しました。
cd /usr/binとし、直下のディレクトリを確認したところ、pythonはあったものの、python3はなかったため、
python3へのパスが正しく記載できていなかったことが原因のようです。

みなさまありがとうございました!

投稿2020/10/27 00:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問