4

私は現在、Pythonで行っているすべてのリクエストに対してNetwork is unreachableエラーを受け取ります。urllib ライブラリまたは requests ライブラリを使用しているかどうかは関係ありません。

さらに調査した結果、IPv6 トンネルの不適切なセットアップが原因である可能性が高く、これはまだアクティブであるようです。

$ ip -6 addr show  
$ ip -6 route
default dev wlan0  metric 1

いくつかのコンテキスト: 私は Archlinux を実行していて、今日システムを更新しましたが、今日は Python に関連する特別な更新はないようです。私もこれをvirtualenvの下で実行していますが、他のvirtualenvとvirtualenvの外でPythonを使用しても同じ問題があります。
VPN を使用していますが、VPN がなくても同じエラーが発生します。また、PC を再起動しようとしましたが、通常は問題を解決するのに役立ちますが、役に立ちませんでした。
Archlinuxに関連している可能性があると感じましたが、よくわかりません。

これは、ipv6トンネルをセットアップするために以前に試したことです:

sudo modprobe ipv6
sudo ip tunnel del sit1
sudo ip tunnel add sit1 mode sit remote 59.66.4.50 local $ipv4
sudo ifconfig sit1 down
sudo ifconfig sit1 up
sudo ifconfig sit1 add 2001:da8:200:900e:0:5efe:$ipv4/64
sudo ip route add ::/0 via 2001:da8:200:900e::1 metric 1 

このコマンドも使用しました:

ip -6 addr add 2001:0db8:0:f101::1/64 dev eth0 

私の /etc/systemctl.conf で ipv6 の行を削除した後、いくつかの URL が機能し始めました:

>>> urllib2.urlopen('http://www.google.com')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 400, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 418, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1207, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 101] Network is unreachable>
>>> urllib2.urlopen('http://baidu.com')
<addinfourl at 27000560 whose fp = <socket._fileobject object at 0x7f4d1fed5e50>>

これは ipython のエラー ログです。

In [1]: import urllib2

In [2]: urllib2.urlopen('http://google.com')
---------------------------------------------------------------------------
URLError                                  Traceback (most recent call last)

/home/samos/<ipython console> in <module>()

/usr/lib/python2.7/urllib2.py in urlopen(url, data, timeout)
    124     if _opener is None:
    125         _opener = build_opener()
--> 126     return _opener.open(url, data, timeout)
    127 
    128 def install_opener(opener):

/usr/lib/python2.7/urllib2.py in open(self, fullurl, data, timeout)
    398             req = meth(req)
    399 
--> 400         response = self._open(req, data)
    401 
    402         # post-process response


/usr/lib/python2.7/urllib2.py in _open(self, req, data)
    416         protocol = req.get_type()
    417         result = self._call_chain(self.handle_open, protocol, protocol +
--> 418                                   '_open', req)
    419         if result:
    420             return result

/usr/lib/python2.7/urllib2.py in _call_chain(self, chain, kind, meth_name, *args)
    376             func = getattr(handler, meth_name)
    377 
--> 378             result = func(*args)
    379             if result is not None:
    380                 return result

/usr/lib/python2.7/urllib2.py in http_open(self, req)
   1205 
   1206     def http_open(self, req):
-> 1207         return self.do_open(httplib.HTTPConnection, req)
   1208 
   1209     http_request = AbstractHTTPHandler.do_request_

/usr/lib/python2.7/urllib2.py in do_open(self, http_class, req)
   1175         except socket.error, err: # XXX what error?
   1176             h.close()
-> 1177             raise URLError(err)
   1178         else:
   1179             try:

URLError: <urlopen error [Errno 101] Network is unreachable>

Web ブラウザから通常どおり google.com にアクセスでき、ネットワークに到達できることを確信しています。

4

2 に答える 2

4

インターネットにアクセスするために http プロキシ サーバーを使用していないことを確認しますか?

ブラウザのネットワーク設定をプロキシなしに変更してみて、まだインターネットに接続しているかどうかを確認してください。

また、プロキシを使用している場合 (プロキシ アドレスをhttp://yourproxy.comと想定)、これを実行して問題が解決するかどうかを確認してください。

import urllib2
proxy = urllib2.ProxyHandler({'http': 'yourproxy.com'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')
于 2012-05-04T14:43:42.597 に答える
1

大きなことは、ファイルのバックアップを元に戻すことで /etc/hosts ファイルを編集したことで、すべてが再び機能し始めました。Facebookなどのipv6アドレスを手動で設定するために優れたファイアウォールをバイパスするためにこれを行ったので、まだそれらのipv6アドレスを使用していました...

学んだ教訓:働きすぎず、急いで物事をしないでください。常に自分が何をしているかを理解し、何をしたかを正確に書き留めるように努めてください。したがって、後退する方法があります。

次の行を削除すると、/etc/systemctl.conf で少し役立つようです。

net.ipv6.conf.all.forwarding = 1

最終的には役に立ちませんでしたが、ブラウザでアクセスできますが、Network is unreachable for google.com というエラーが引き続き表示されます。

>>> urllib2.urlopen('http://baidu.com')
<addinfourl at 27000560 whose fp = <socket._fileobject object at 0x7f4d1fed5e50>>
>>> urllib2.urlopen('http://www.google.com')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 400, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 418, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1207, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 101] Network is unreachable>
于 2012-05-04T15:02:17.090 に答える