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

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

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

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

Python 3.x

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

HTML

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

Q&A

1回答

9196閲覧

pythonのimportエラーについて(attempted relative import with no known parent package)

NaokiIguchi

総合スコア0

CGI

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

Python 3.x

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

HTML

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

0グッド

0クリップ

投稿2020/06/02 19:27

編集2020/06/03 15:53

みんなのPython Webアプリ編からの質問です。ローカルサーバーを立てて、Webアプリケーションに関するコードを試しているときに、どうしても解消できないエラーがあります。

以下のコードをcgi-binディレクトリに格納し、ブラウザからpicklepole.pyを実行するのが目標です。

サーバーはターミナルから py -m http.server 8080 --cgi という形で立ち上げられ、
index.htmlやcgi-binフォルダにあるほかのpythonアプリは問題なく動作している状況です。

前提・実現したいこと

エラーの解消をどうしたら実現できるでしょうか?
同じ/cgi-bin/ディレクトリに存在する、httphandler.pyをimportする際に問題が生じていることは
何となくわかるのですが、同じディレクトリ内部での相対参照では、from .httphandler import *
の様な形でimportするだけではまずいのでしょうか?

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

以下の様なエラーが表示されてしまい、ブラウザ上には何も表示されず行き詰ってしまっています。

Python

1 File "C:\Users\hogehoge\Desktop\LocalServerTest\cgi-bin\picklepole.py", line 5, in <module> 2 from .httphandler import Request, Response, get_htmltemplate 3ImportError: attempted relative import with no known parent package 4

該当のソースコード

Python

1#!/usr/bin/env python 2# coding: utf-8 3 4import pickle 5from .httphandler import Request, Response, get_htmltemplate 6import cgitb 7 8cgitb.enable() 9 10form_body = """ 11 <form method="POST" action="/cgi-bin/picklepole.py"> 12 好きな軽量言語は?<br /> 13 %s 14 <input type="submit" /> 15 </form>""" 16 17radio_parts = """ 18<input type="radio" name="language" value="%s" />%s 19<div style="border-left: solid %sem red; ">%s</div> 20""" 21 22lang_dic = {} 23try: 24 f = open('./favorite_language.dat') 25 lang_dic = pickle.load(f) 26except IOError: 27 pass 28 29content = "" 30req = Request() 31if 'language' in req.form: 32 lang = req.form['language'].value 33 lang_dic[lang] = lang_dic.get(lang, 0) + 1 34 35f = open('./favorite_language.dat', 'w') 36pickle.dump(lang_dic, f) 37 38for lang in ['Perl', 'PHP', 'Python', 'Ruby']: 39 num = lang_dic.get(lang, 0) 40 content += radio_parts % (lang, lang, num, num) 41 42res = Response() 43body = form_body % content 44res.set_body(get_htmltemplate() % body) 45print(res) 46

httphandler.pyについて

httphandlerは以下の様なコードになります。

Python

1# 標準モジュールをimportする。 2import cgi 3import os 4 5 6class Request(object): 7 """ 8 HTTPのリクエストをハンドリングするクラスです。 9 CGI側でインスタンスを生成することによって利用する 10 クエリデータや環境変数へのアクセス、主要ヘッダへの 11 アクセス用メソッドを提供します。 12 """ 13 14 def __init__(self, environ=os.environ): 15 """ 16 インスタンスの初期化メソッド 17 クエリ、環境変数をアトリビュートとして保持する。 18 """ 19 self.form = cgi.FieldStorage() 20 self.environ = environ 21 22 23def get_htmltemplate(): 24 """ 25 レスポンスとして返すHTMLのうち,定型部分を返す 26 """ 27 html_body = u""" 28 <html> 29 <head> 30 <meta http-equiv="content-type" 31 content="text/html;charset=utf-8" /> 32 </head> 33 <body> 34 %s 35 </body> 36 </html>""" 37 return html_body 38 39 40class Response(object): 41 """ 42 HTTPのレスポンスをハンドリングするクラスです。 43 レスポンスを送信する前にインスタンスを生成して利用します。 44 レスポンスやヘッダの内容を保持し、ヘッダを含めたレスポンスの 45 送信を行います。 46 """ 47 48 def __init__(self, charset='utf-8'): 49 self.headers = {'Content-type': 'text/html;charset=%s' % charset} 50 self.body = "" 51 self.status = 200 52 self.status_message = '' 53 54 def set_header(self, name, value): 55 """ 56 レスポンスのヘッダを設定する。 57 :param name: 58 :param value: 59 :return: 60 """ 61 self.headers[name] = value 62 63 def get_header(self, name): 64 """ 65 設定済みのレスポンス用ヘッダを返す 66 :param name: 67 :return: 68 """ 69 return self.headers.get(name, None) 70 71 def set_body(self, bodystr): 72 """ 73 レスポンスとして出力する本文の文字列を返す 74 :param bodystr: 75 :return: 76 """ 77 self.body = bodystr 78 79 def make_output(self, timestamp=None): 80 """ 81 ヘッダと本文を含めたレスポンス文字列を作る 82 :param timestamp: 83 :return: 84 """ 85 import time 86 _weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] 87 _monthname = [None, 88 "Jan", "Feb", "Mar", "Apr", "May", "Jun", 89 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] 90 if timestamp is None: 91 timestamp = time.time() 92 year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp) 93 dtstr = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (_weekdayname[wd], day, _monthname[month], year, hh, mm, ss) 94 self.set_header("Last-Modified", dtstr) 95 headers = '¥n'.join(["%s: %s" % (k, v) 96 for k, v in self.headers.items()]) 97 return headers + '¥n¥n' + self.body 98 99 def __str__(self): 100 """ 101 リクエストを文字列に変換する。 102 :return: 103 """ 104 return self.make_output().encode('utf-8') 105 106

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

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

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

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

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

ForestSeo

2020/06/02 23:52

httphandler.pyはどんな感じですか?
NaokiIguchi

2020/06/03 15:50

httphandlerは以下のURLのものをPython3のものに簡単に変更を加えたものになります。 https://coreblog.org/ats/stuff/minpy_web/07/03.html # 標準モジュールをimportする。 import cgi import os class Request(object): """ HTTPのリクエストをハンドリングするクラスです。 CGI側でインスタンスを生成することによって利用する クエリデータや環境変数へのアクセス、主要ヘッダへの アクセス用メソッドを提供します。 """ def __init__(self, environ=os.environ): """ インスタンスの初期化メソッド クエリ、環境変数をアトリビュートとして保持する。 """ self.form = cgi.FieldStorage() self.environ = environ def get_htmltemplate(): """ レスポンスとして返すHTMLのうち,定型部分を返す """ html_body = u""" <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> %s </body> </html>""" return html_body class Response(object): """ HTTPのレスポンスをハンドリングするクラスです。 レスポンスを送信する前にインスタンスを生成して利用します。 レスポンスやヘッダの内容を保持し、ヘッダを含めたレスポンスの 送信を行います。 """ def __init__(self, charset='utf-8'): self.headers = {'Content-type': 'text/html;charset=%s' % charset} self.body = "" self.status = 200 self.status_message = '' def set_header(self, name, value): """ レスポンスのヘッダを設定する。 :param name: :param value: :return: """ self.headers[name] = value def get_header(self, name): """ 設定済みのレスポンス用ヘッダを返す :param name: :return: """ return self.headers.get(name, None) def set_body(self, bodystr): """ レスポンスとして出力する本文の文字列を返す :param bodystr: :return: """ self.body = bodystr def make_output(self, timestamp=None): """ ヘッダと本文を含めたレスポンス文字列を作る :param timestamp: :return: """ import time _weekdayname = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] _monthname = [None, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] if timestamp is None: timestamp = time.time() year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp) dtstr = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (_weekdayname[wd], day, _monthname[month], year, hh, mm, ss) self.set_header("Last-Modified", dtstr) headers = '¥n'.join(["%s: %s" % (k, v) for k, v in self.headers.items()]) return headers + '¥n¥n' + self.body def __str__(self): """ リクエストを文字列に変換する。 :return: """ return self.make_output().encode('utf-8')
NaokiIguchi

2020/06/03 16:24

PyCharmでcgi-binディレクトリをSource Rootに設定したら無事インポートできたのですが、 ブラウザ上でpicklepole.pyにアクセスすると、新たに、 A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred. C:\Users\hogehoge\Desktop\LocalServerTest\cgi-bin\picklepole.py in <module> 42 43 res = Response() 44 body = form_body % content 45 res.set_body(get_htmltemplate() % body) => 46 print(res) builtin print = <built-in function print>, res = <httphandler.Response object> TypeError: __str__ returned non-string (type bytes) args = ('__str__ returned non-string (type bytes)',) with_traceback = <built-in method with_traceback of TypeError object> というエラーが出てきてしまい、調べても解決できず、別の問題で困っています。
guest

回答1

0

何となくわかるのですが、同じディレクトリ内部での相対参照では、from .httphandler import *

の様な形でimportするだけではまずいのでしょうか?

picklepole.pyを実行しているPythonのプロセスのカレントディレクトリが"C:\Users\hogehoge\Desktop\LocalServerTest\cgi-bin"になっていると思うので、相対インポートはできません。

from httphandler import Request, Response, get_htmltemplate

として絶対インポートします。


再現手順

plain

1% echo "hoge = 2" > b.py 2 3% echo "from .b import hoge" > a.py 4% python a.py 5Traceback (most recent call last): 6 File "a.py", line 1, in <module> 7 from .b import hoge 8ImportError: attempted relative import with no known parent package 9 10% echo "from b import hoge" > a.py 11% python a.py 12%

投稿2020/06/03 01:34

quickquip

総合スコア11202

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

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

NaokiIguchi

2020/06/03 15:48

ご回答いただきありがとうございます。 pycharmを使って、同じディレクトリにあるhttphandler.pyを from httphandler import Request, Response, get_htmltemplate でインポートするコードを記入すると、Unresolved reference 'httphandler' というエラーがマウスのカーソルを合わせると表示される状態です。(ブラウザでアクセスをするとエラーこそTerminalに表示はされないのですが、ブラウザ上の画面は真っ白のままです。もしかしたら、表示するためのコードが間違っているのでしょうか?) また、from .httphandler import Request, Response, get_htmltemplateという形でコードを書くと、PyCharm上でのエラーはなくなるのですが、ブラウザでのアクセス時に ImportError: attempted relative import with no known parent package のエラーが表示されるという状況です。
NaokiIguchi

2020/06/03 16:25

PyCharmでcgi-binディレクトリをSource Rootに設定したら無事インポートできたのですが、 ブラウザ上でpicklepole.pyにアクセスすると、新たに、 A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred. C:\Users\hogehoge\Desktop\LocalServerTest\cgi-bin\picklepole.py in <module> 42 43 res = Response() 44 body = form_body % content 45 res.set_body(get_htmltemplate() % body) => 46 print(res) builtin print = <built-in function print>, res = <httphandler.Response object> TypeError: __str__ returned non-string (type bytes) args = ('__str__ returned non-string (type bytes)',) with_traceback = <built-in method with_traceback of TypeError object> というエラーが出てきてしまい、新たなこのエラーについて、調べても解決できず、別の問題で困っています...。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問