アプリ版:「スタンプのみでお礼する」機能のリリースについて

PyCharmで下記のCGIを使ったWebサーバーアプリを動かそうとすると下記のエラーが出ます。
http://localhost:8000/ へのアクセスはうまくいくのですが、
http://localhost:8000/cgi-bin/compound.py にアクセスしようとすると、

serving at port 8000
127.0.0.1 - - [27/Nov/2015 17:03:16] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [27/Nov/2015 17:03:35] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [27/Nov/2015 17:03:41] "GET /cgi-bin/compound.py HTTP/1.1" 200 -
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/server.py", line 1117, in run_cgi
os.execve(scriptfile, args, env)
OSError: [Errno 8] Exec format error: '/Users/xxxxxxx/PycharmProjects/Compound/cgi-bin/compound.py'
127.0.0.1 - - [27/Nov/2015 17:03:41] CGI script exit status 0x7f00
127.0.0.1 - - [27/Nov/2015 17:03:50] "GET /cgi-bin/compound.py HTTP/1.1" 200 -
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/server.py", line 1117, in run_cgi
os.execve(scriptfile, args, env)
OSError: [Errno 8] Exec format error: '/Users/xxxxxxx/PycharmProjects/Compound/cgi-bin/compound.py'
127.0.0.1 - - [27/Nov/2015 17:03:50] CGI script exit status 0x7f00
127.0.0.1 - - [27/Nov/2015 17:03:52] code 403, message CGI script is not a plain file ('/cgi-bin/')
127.0.0.1 - - [27/Nov/2015 17:03:52] "GET /cgi-bin/ HTTP/1.1" 403 -
127.0.0.1 - - [27/Nov/2015 17:04:06] "GET /cgi-bin/compound.py HTTP/1.1" 200 -

のエラーが出ます。どこが悪いのかが分かりかねています。ご経験のある方、ご教示いただけないでしょうか?

ディレクトリの構成は、Compoundプロジェクトの下にserver.pyファイルとcgi-binフォルダーがあり、cgi-binフォルダーの中に、compound.pyファイルがあります。環境はMacのOS-X(El Capitan)でブラウザはSafariを使っています。

ここから、

(server.pyファイル)
from http.server import HTTPServer, \
CGIHTTPRequestHandler

port = 8000
httpd = HTTPServer(('localhost', port),
CGIHTTPRequestHandler)
print('serving at port', port)
httpd.serve_forever()


(compound.pyファイル)
import cgi

def read(name):
s = form.getvalue(name, '0')
if s != '0':
global output
output += \
"<script>document.getElementsByName('" + \
name + "')[0].value='" + s + "'</script>\n"
return s

output = ''
form = cgi.FieldStorage()
html_body = """
<!DOCTYPE html>
<html>
<head lang='jp'>
<meta charset='utf-8'>
<title>複利計算</title>
</head><body>
<h2>1年もの定期預金の複利計算</h2>
<form method='post'>
元金:<input name='inputPrincipal'
value='100000' style='text-align: right;' />円 
利子:<input name='inputInterest' value='1'
style='text-align: right;' />パーセント
<p><button type='submit'>
実行</button></p>
</form>
%s
</body></html>"""
existError = False
try:
principal = float(read('inputPrincipal'))
interest = float(read('inputInterest'))
except:
existError = True

if existError:
output += '入力値が不適切です'
else:
if principal != 0:
interest += 100.0
for i in range(1, 11):
principal = (principal * interest) / 100.0
output += '{0:0>2}'.format(i) + '年後:' + \
str(principal) + '円<br>\n'

print('Content-Type: text/html; charset=utf-8;\n')
print(html_body % output)


よろしくお願いいたします。

質問者からの補足コメント

  • 情報ありがとうございます。
    パーミションの設定は合っています。
    改行はおっしゃるようにCRLFになっていたので、LFに直しましたが、
    結果は同じエラーが出ます。http://localhost:8000/の後の”cgi-bin”の"c"を打った
    段階でエラーが出ます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/11/27 21:19
  • classの記述でSyntaxErroroが出るみたいです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/11/27 22:52
  • ①は755でOKです。
    ②は特に問題ありません。

    No.3の回答に寄せられた補足コメントです。 補足日時:2015/11/28 12:31
  • うーん・・・

    今度は、文法エラーはなくなりましたが、結果は今までと同じです。
    ちょっと教えてほしいのですが、この問題は、cgi-binをCGIのフォルダとして認識
    すべきところを、認識していないということなのでしょうか?

    後、Macではなく、Windows用のPyCharmでやれば、この問題は解決するんでしょうか?

    No.4の回答に寄せられた補足コメントです。 補足日時:2015/11/28 15:50

A 回答 (5件)

>ちょっと教えてほしいのですが、この問題は、cgi-binをCGIのフォルダとして認識・・・



そうです。
ルートのserver.pyは動作しているようなので、
cgi-binでもCGIが動作するようにと・・・。

>後、Macではなく、Windows用のPyCharmでやれば、この問題は解決するんでしょうか?
Windowsだから、Macだからということではないと思います。
実は、かなり前にPythonでWebアプリを開発した経験があったので、何か役に立てればと思ったのですが・・・。
当時は、WindowsにNetbeans(IDE)とApache(Webサーバー)をインストールして動作させていました。
(PyCharmは使っていないのです・・・。(汗)
しかも、調べているうちに、WSGIというフレームワークやMVCモデルのサポートなど、かなり環境が変わっていて、少し参っていたところです。

http://p--q.blogspot.jp/2014/05/wsgi1pythonwsgi. …
ここの、Hello,world.のサンプルは問題なく動作すると思います。
http://d.hatena.ne.jp/uriyuri/20081024/1224839381
このサンプルも動作すると思うが、古いのでWSGIではない?
http://blog.sarabande.jp/post/81479479934
これを参考に、server.pyを書き換えてもらった。
http://docs.python.jp/3.3/howto/webservers.html
ここを基本にしています。「低レベルから見て」は理解できるのですが、
「後ろに下って: WSGI」あたりから???

参考にしてみてください。
    • good
    • 0
この回答へのお礼

ご指摘いただいた上記の参照例を調べて、理由が分かりました。
compound.pyのimport cgiの前に
#!/usr/bin/python
# -*- coding: utf-8 -*-

の2つの記述が抜けているためでした。
この2つの記述の追加でエラーを吐かなくなって意図した動作ができるようになりました。

ありがとうございました。

お礼日時:2015/11/28 23:53

再度挑戦・・・(汗



(server.pyファイル)
from http.server import HTTPServer, CGIHTTPRequestHandler

class MyHandler(CGIHTTPRequestHandler):
  cgi_directories = ['/cgi-bin', '/']

port = 8000
httpd = HTTPServer(('localhost', port), MyHandler)
print('serving at port', port)
httpd.serve_forever()

これで、どうですか?
この回答への補足あり
    • good
    • 0

2点ほど確認してみてください。



①cgi-binフォルダのパーミッション。
②プロジェクトのルートフォルダに2バイト文字や半角スペースが入っていないか?
この回答への補足あり
    • good
    • 0

>code 403, message CGI script is not a plain file ('/cgi-bin/')


このエラーメッセージが問題で、
cgi-binをCGIのフォルダとして認識していません。

(server.pyファイル)
from http.server import HTTPServer, \
CGIHTTPRequestHandler

の部分を

(server.pyファイル)
from http.server import HTTPServer, \
class MyHandler(CGIHTTPRequestHandler):
cgi_directories = ['/cgi-bin']

としても駄目ですか?
この回答への補足あり
    • good
    • 0

compound.pyの実行権限は間違っていませんか?


ls -l
で確認して、compound.pyが
drwxr-x-x
になっていなければ、
chmod 755 compound.py
で権限を変更してください。

また、改行コードもCRLFではなく、LFだったと思うので
そちらも確認してみてください。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!