• 締切済み

Pythonプログラムのエラー

こんにちは。pythonプログラムを勉強しはじめたばかりのものです。 次のプログラムが最後の行の#のところでエラーになってなかなか 解決ができません。アドバイスいただけませんでしょうか。 #! /python30/python # coding:shift_jis import sys, os, urllib, gzip def GetAndGzip(url, out): ''' urlを読み込み、gzipで圧縮してファイルoutに出力 ''' remote = urllib.urlopen(url).read() gzfile = gzip.GzipFile(filename='', mode='web', fileobj=out) gzfile.write(remote) gzfile.colse() #パラメータを抽出 if len(sys.argv) <> 2: print '使い方:python wgetgz.py url' else: url = sys.argv[1] GetAndGzip(url, sys.stdout) #ここでエラーin<module> #ここで投稿すると、インデントがなくなってしまうようです。

  • Python
  • 回答数2
  • ありがとう数2

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

すみません。ちょっと開きました。 #1の補足にあったスクリプトで試してみましたが、 補足にあるようなエラーにはなりませんでした。 圧縮されたバイナリが画面に出てきて、ぐちゃぐちゃに。 とはいえ#1でわたしがつけたスクリプトですが、 ____gzfile.colse() これは ____gzfile.close() の間違いでした。 でもこれだけでは補足にあるメッセージにはならないんですよねえ。 もうちょっと調べさせてください。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

あ、二つあったんですか。 こっちは見落としてた。 えと、 #! /python30/python とあるので、3.0で動かそうとしているのかもしれませんが、 2.xから3.0へのバージョンアップに伴い変わった部分に引っかかっているのがあります。 ひょっとしてもとは2.x用のスクリプトを書き写したとかではないですか? import sys, os, urllib, gzip 3.0 では、urllib ではなく urllib.request を import してください。 そして呼び出し部分にも request を追加してください。 remote = urllib.urlopen(url).read() ↓ remote = urllib.request.urlopen(url).read() 3.0では等しくないという検査をする演算子に<>を使えなくなりました。 if len(sys.argv) <> 2: ↓ if len(sys.argv) != 2: 文字列の扱いが変わったので、標準出力(sys.stdout)に圧縮結果のような バイナリイメージを出力できなくなりました。 GetAndGzip(url, sys.stdout) ↓ GetAndGzip(url, sys.stdout.buffer) 以上の変更を行えばきちんと動くようになると思います。 3.0は大きなバージョンアップが行われたばかりなので、ネットで探しても 3.0では事情が変わってそのまま使えないというものが見つかりやすいと思います。 今3.0でなければならないという理由がなければ、 2.6系列(今の最新は2.6.1?)を使った方が良いと思います。 import sys, os, urllib, gzip import urllib.request def GetAndGzip(url, out): ____''' urlを読み込み、gzipで圧縮してファイルoutに出力 ____''' ____remote = urllib.request.urlopen(url).read() ____#remote = urllib.urlopen(url).read() ____gzfile = gzip.GzipFile(filename='', mode='web', fileobj=out) ____gzfile.write(remote) ____gzfile.colse() #パラメータを抽出 if len(sys.argv) != 2: ____print('使い方:python wgetgz.py url') else: ____url = sys.argv[1] GetAndGzip(url, sys.stdout.buffer) #ここでエラーin<module> 行頭の空白はなくなってしまうので、_で置き換えてます。

kenji_yodo
質問者

補足

ご指摘ありがとうございます。  使っているPYTHONのバージョンが3.0で  勉強しているテキストがバ-ジョン2.6をベースに書かれているようです。 ところで、テキストを次のように変えたのですが、 やはり、同じく最後の行でエラーになります。 すいませんが、アドバイスいただけると有難いです。 #! /python30/python # coding:shift_jis import sys, os, urllib, gzip import urllib.request def GetAndGzip(url, out): ''' urlを読み込み、gzipで圧縮してファイルoutに出力 ''' remote = urllib.request.urlopen(url).read() gzfile = gzip.GzipFile(filename='', mode='web', fileobj=out) gzfile.write(remote) gzfile.colse() #パラメータを抽出 print(len(sys.argv)) if len(sys.argv) != 2: print('使い方:python wgetgz.py url') #print文修正 else: url = sys.argv[1] GetAndGzip(url, sys.stdout.buffer) #ここでエラーin<module> # この後はDOS窓でみたエラーの状況 C:\PythonProg>wgetgz.py http://www.yahoo.com 2 Traceback (most recent call last): File "C:\Python30\lib\urllib\request.py", line 1067, in do_open h.request(req.get_method(), req.get_selector(), req.data, header File "C:\Python30\lib\http\client.py", line 862, in request self._send_request(method, url, body, headers) File "C:\Python30\lib\http\client.py", line 906, in _send_request self.endheaders() File "C:\Python30\lib\http\client.py", line 857, in endheaders self._send_output(message_body) File "C:\Python30\lib\http\client.py", line 715, in _send_output self.send(msg) File "C:\Python30\lib\http\client.py", line 669, in send self.connect() File "C:\Python30\lib\http\client.py", line 653, in connect self.timeout) File "C:\Python30\lib\socket.py", line 292, in create_connection for res in getaddrinfo(host, port, 0, SOCK_STREAM): socket.gaierror: [Errno 11001] getaddrinfo failed During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\PythonProg\wgetgz.py", line 21, in <module> GetAndGzip(url, sys.stdout.buffer) #ここでエラーin<module> File "C:\PythonProg\wgetgz.py", line 10, in GetAndGzip remote = urllib.request.urlopen(url).read() File "C:\Python30\lib\urllib\request.py", line 122, in urlopen return _opener.open(url, data, timeout) File "C:\Python30\lib\urllib\request.py", line 358, in open response = self._open(req, data) File "C:\Python30\lib\urllib\request.py", line 376, in _open '_open', req) File "C:\Python30\lib\urllib\request.py", line 336, in _call_chain result = func(*args) File "C:\Python30\lib\urllib\request.py", line 1082, in http_open return self.do_open(http.client.HTTPConnection, req) File "C:\Python30\lib\urllib\request.py", line 1070, in do_open raise URLError(err) urllib.error.URLError: <urlopen error [Errno 11001] getaddrinfo fail

関連するQ&A

  • python urlopen error について教えてください

    pythonを、勉強したてです。 開発環境は、python2.6/win XP です。 HTMLを解析するために、 http://www.crummy.com/software/BeautifulSoup/ からライブラリーを入手して、C:\Python26\Lib\site-packages\BeautifulSoup-3.1.0.1 に配置しました。 python環境設定のパスは、通してあります。 プログラムは、http://www.freia.jp/taka/blog/169 の「myparser.py」をそのまま使いました。(動作テストのため) ------- 結果 -------- メッセージ ファイル名 行 位置 Traceback <module> C:\Python26\src\myparser.py 50 main C:\Python26\src\myparser.py 41 urlopen C:\Python26\Lib\urllib2.py 124 open C:\Python26\Lib\urllib2.py 383 _open C:\Python26\Lib\urllib2.py 401 _call_chain C:\Python26\Lib\urllib2.py 361 http_open C:\Python26\Lib\urllib2.py 1130 do_open C:\Python26\Lib\urllib2.py 1105 URLError: <urlopen error [Errno 11001] getaddrinfo failed> ネットワーク環境は、プロキシ・サーバを返していますが、どうやっても上記のエラーで引っ掛かってしまいます。

  • pythonでエラー「out of memory」

    python seleniumでエラー「out of memory」の解決策を教えてほしいです。 python seleniumでブラウザの自動操作を行っています。 一覧の画面にボタンがあり、For文で繰り返し画面遷移を行っています。 処理が進むにつれてメモリがどんどん増え、最終的にメモリ不足で処理が停止してしまいます。 tracemallocでメモリの容量を見たところ 下記の2つが処理が進むにつれてメモリどんどん増えています。 C:\Users\xxx\AppData\Local\Programs\Python\Python311\Lib\urllib\parse.py:387: size=27.0 KiB, count=257, average=108 B C:\Users\xxx\AppData\Local\Programs\Python\Python311\Lib\urllib\parse.py:411: size=25.5 KiB, count=256, average=102 B ファイルの内容としてはurlが関係しているのかなと考えています。 parse.py:387⇒splitresult = urlsplit(url, scheme, allow_fragments) parse.py:411⇒return url[start:delim], url[delim:] parse.pyはシステムファイル?のためどのようにメモリの解放を行えばよいのか調査しましたが解決策が思い浮かびませんでした。 途中でメモリの解放等を行う方法がありますでしょうか?

  • Pythonプログラミングでエラー

    Pythonのプログラムを教科書をみながら勉強しはじめました。 バージョンは3.0.1です。 下記の初歩的なプログラムで#の行でエラーがでて対応方法が わかりません。 アドバイスいただけませんでしょうか。 #! /python30/python # coding:shift_jis ''' 簡単な電卓です。 Usage: mycalc.py n (+-*/) m ''' import sys, operator OP={'+':operator.__add__,\ '-':operator.__sub__,\ '*':operator.__mul__,\ '/':operator.__truediv__,\ } def calc(ls): assert len(ls)==3 #ここでエラー try: op=OP(ls.pop(1)) # 真ん中の文字列をpop,数字のみ残る。 x,y=[float(u) for u in ls] # 残った文字列をfloatに変換 except: print('Err:数字 演算子(+-*/) 数字 の順に引数をセットしてください。') sys.exit() return op(x,y) if __name__=='__main__': print(calc(sys.argv[1:])) #ここでエラー (ここで質問するとTABのインデントがなくなってしまうようです。)

  • pyhtonのエラーについて教えて下さい。

    pythonを勉強しようと思いネット上の解説サイトを読んでいます。 以下の様なサンプルプログラムがでてきたのでコピペして実行してみました。 プログラム import sys # sysモジュールをimport # sys.argvにコマンドライン引数が「リスト」で格納されている print(sys.argv) print(len(sys.argv)) ただ、実行すると ”sys:1: DeprecationWarning: Non-ASCII character '\xa5' in file cl.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details” といったエラーが表示されてうまく動作してくれません。 1行目のimportでエラーとなっているようなので環境 orバージョンの問題なのかと思うのですがよくわかりません。 対処方法をどなたか教えていただけないでしょうか?

  • pythonのエラーについて教えて下さい。

    pythonの勉強をおこなっている超初心者です。 ネットでみた。以下のサンプルコードを実行しようとしました。 # -*- coding: utf-8 -*- print u'モジュールのロード' def test(): print u'関数:testを呼び出しました' if __name__ == '__main__': print 'python-izm' # print 'パイソンイズム' test() しかし、以下の様なエラーとなってしまいます。 File ”test02.py"、line 9 print ’python-izm'  ^ indentionError:expected an indented block ネット調べてみたとことpythonのインデントのエラーだとわかりました。 pythonはインデントで実行範囲を認識するので、 そこがうまく記述できていないであろうとは思うのですが、何回か試したのですが うまく動いてくれません。 どなたか御指南下さい。

  • pythonのシンタックスエラー

    python3のサンプルコードがあり、エラーが出ます。 内容はファイルを開いてちょっと変更して中身をプリントするというものです。 これは私が書いたのではなく、本の付録のサンプルなのですが、文法エラーとなります。何が原因かご指摘を頂ければと思いますが。文字コードの問題かなと思いましたが、UTF_8となっています。ファイルをdata.pyとして保存して、コマンドでpython data.pyを叩いたときに出てきます。(すみません、ここに張り付けた段階でインデントが見えなくなっているようですが、それは実際は問題ないです) file = "data.dat" limit = 2.0 with open(file, "r", encoding="utf_8") as fileobj: for i, line in enumerate(fileobj): if line == "\n": continue datalist = line.split(",") result = [int(float(num)<=limit) for num in datalist] print(f"{i}:{result}") #エラーメッセージ # File "data.py", line 9 # print(f"{i}:{result}") ^ #SyntaxError: invalid syntax これに関連する質問ですが、pythonはコンパイルしないようになっているみたいなので、コンパイル時のエラーと実行時のエラーの区別がつきません。このエラーは実際に動作してエラーが出ているということなのでしょうか。他の言語ではシンタックスエラーはコンパイルエラーなので実行前のエラーとは思いますが、文法チェックと実行の関係を教えて頂ければと思いますが。 よろしくお願いします。

  • pythonのプログラムを走らせるには?

    使用するソフトウェアの関係でWeb(HTMLまたはPHP)とPythonの連携が必要になりました。 しかしPythonをWebで扱ったことがなくいまいちどうしたらいいのか分りません。 <form action="/python/pythontest.py" method="GET">  <input type="submit" name="submit" value="更新"> </form> といった形で呼び出しているのですがファイルが開かれるだけでptythonのプログラムが実行されません。 pythonのプログラムは #!/usr/bin/env python # coding: utf-8 import cgi from datetime import datetime html_body = u""" <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body> %s </body> </html>""" content='' print "Content-type: text/html;charset=utf-8\n" print (html_body % content).encode('utf-8') と書いています。 何が原因なのでしょうか? /usr/bin/env python のパスがうまく通っていないからでしょうか?

    • ベストアンサー
    • HTML
  • Pythonで、htmlソースを取得した時

    urllib2.urlopen('url').read() 上記の方法でhtmlのソースを取得していますが、あるデータにおいて、 ブラウザ上→存在する ブラウザでソースを表示→存在する Pythonでソースを取得→存在しない といった事が起こり、取得出来ないデータがあります。 1. 何故このような事が起こるのか、考えられる原因 2. このデータをPythonで取得する方法はあるか、あるならどんな方法か 以上2点を教えてください。 宜しくお願いいたします。

  • Pythonスクリプトが実行できない

     インターネット上で公開されているスクリプトなのですが、実行しようとするとエラーが出てしまいます。どうすれば正しく実行することができるのか、分かる方教えていただけると助かります。よろしくお願いします。  エラーメッセージはスクリプトの下に記載します。  ニコニコ動画にログインし、マイページに新規マイリストを作成して、任意の動画をマイリストに登録するスクリプトです。 #!/usr/bin/env python #coding: utf8 userid="ここにメールアドレスを入力" passwd="ここにパスワードを入力" import sys, re, cgi, urllib, urllib2, cookielib, xml.dom.minidom, time import simplejson as json def getToken(): html = urllib2.urlopen("http://www.nicovideo.jp/my/mylist").read() for line in html.splitlines(): mo = re.match(r'^\s*NicoAPI\.token = "(?P<token>[\d\w-]+)";\s*',line) if mo: token = mo.group('token') break assert token return token def mylist_create(name): cmdurl = "http://www.nicovideo.jp/api/mylistgroup/add" q = {} q['name'] = name.encode("utf8") q['description'] = "" q['public'] = 0 q['default_sort'] = 0 q['icon_id'] = 0 q['token'] = token cmdurl += "?" + urllib.urlencode(q) j = json.load( urllib2.urlopen(cmdurl), encoding='utf8') return j['id'] def addvideo_tomylist(mid,smids): for smid in smids: cmdurl = "http://www.nicovideo.jp/api/mylist/add" q = {} q['group_id'] = mid q['item_type'] = 0 q['item_id'] = smid q['description'] = u"" q['token'] = token cmdurl += "?" + urllib.urlencode(q) j = json.load( urllib2.urlopen(cmdurl), encoding='utf8') time.sleep(0.5) #ログイン opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) urllib2.install_opener(opener) urllib2.urlopen("https://secure.nicovideo.jp/secure/login", urllib.urlencode( {"mail":userid, "password":passwd}) ) #トークン取得 token = getToken() #マイリストの作成と動画の登録 mid = mylist_create(u"テストリスト") addvideo_tomylist(mid, ["sm9","sm1097445", "sm1715919" ] ) <エラーメッセージ> >>> #?^í?^°?^¤?^ó ... opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) >>> urllib2.install_opener(opener) >>> urllib2.urlopen("https://secure.nicovideo.jp/secure/login", ... urllib.urlencode( {"mail":userid, "password":passwd}) ) <addinfourl at 4311877104 whose fp = <socket._fileobject object at 0x101007758>> >>> #?^?^??^ü?^¯?^ó?^?^??^? ... token = getToken() Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<stdin>", line 8, in getToken UnboundLocalError: local variable 'token' referenced before assignment >>> #?^?^??^¤?^ê?^¹?^?^??^???^??^?^??^???^?^??^Ի?^???^ٻ?^̲ ... mid = mylist_create(u"?^?^??^¹?^?^??^ê?^¹?^?^?") Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<stdin>", line 9, in mylist_create NameError: global name 'token' is not defined >>> addvideo_tomylist(mid, ["sm9","sm1097445", "sm1715919" ] ) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'mid' is not defined >>> <環境>imac, mac os x, ターミナルを使用

    • 締切済み
    • Mac
  • python: fork後の標準出力について

    言語はpythonです。(バージョン : 2.6.6) 以下の二つの単純なpythonスクリプト   test.py, exe_fork.py があります。 [test.py] #!/usr/bin/env python import subprocess proc = subprocess.Popen("./exe_fork.py", stdout=subprocess.PIPE) result = proc.stdout.read() print result [exe_fork.py] #!/usr/bin/env python import os import time pid = os.fork() if pid != 0: print "parent\n" else: time.sleep(5) print "child\n" [動作] 各スクリプトの動作としては、 test.pyがexe_fork.pyをPopen(stdoutはPIPEで受信)で実行し、 read()メソッドでexe_fork.pyの標準出力を受け取り、表示する。 exe_fork.pyはforkして、   親プロセスは"parent"と出力   子プロセスは5秒後に"child"と出力 です。 [実行結果] test.pyを実行すると 5秒後に   parent   child と表示されました。 これを実行する前は実行後すぐに "parent" と表示されてスクリプト終了するのだと予想しておりました。 しかし実際はexe_fork.pyの親と子の両方のプロセス終了するまで何も表示されず 両プロセスが終了した後にtest.pyのread()メソッドが完了するようです。 (どういうしくみでそうなっているのかよくわかりません。。) [質問・相談] test.pyでexe_fork.pyの親プロセスの標準出力だけを反映する方法ございませんでしょうか? なお、都合上、以下の条件を満たしている必要がございます。  条件1: test.py側のソースは変更しない  条件2: exe_fork.pyの親プロセスが終了した時点でtest.pyのread()メソッドが終了する  条件3: forkptyは使わない [参考]  exe_fork.py側で子プロセスのみsys.stdout.close()してみましたが結局exe_fork.pyの子プロセスが終了するまで(=5秒経過するまで)test.pyのread()メソッドは完了しませんでした。   よろしくお願いします。

専門家に質問してみよう