2010-01-15 84 views
4

我試圖在Python 2應用程序中啓用IPv6,並且遇到了麻煩。無論何時我嘗試綁定到IPv6套接字,都會引發一個socket.error: getsockaddrarg: bad family異常。我可以簡單地做重現錯誤:Python 2和IPv6

import socket 

s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) 
s.bind(('', 12345)) 

此代碼工作正常,如果我在Python 3運行。不幸的是,劇本需要一個顯著的移植工作在Python 3工作,我寧願沒有這樣做那呢。

我需要做些什麼來獲得IPv6在Python 2中的工作還是我S-O-L?

詳情: 的Python 2.6.2(r262:71600,2009年10月24日,3時16分31秒) [GCC 4.4.1 [GCC-4_4-分支修訂150839]在linux2上 (這是Python的那標準openSUSE 11.2安裝的一部分)。

更新

後AndiDog幫我弄清楚,socket.AF_INET6定義沒有配置IPv6的即使,我發現socket.has_ipv6。這被定義爲一個布爾值並指示Python是否使用IPv6構建。

+1

運行在FreeBSD上的Python 2.6.1沒有問題。 – sberry 2010-01-15 23:19:29

+0

它可以在*非常相同的操作系統或另一個操作系統上使用Python 3嗎? – AndiDog 2010-01-15 23:22:22

+0

@AndiDog - 是的,它可以在同一個操作系統上運行在Python 3上。在一個shell(如此相同的環境)中,如果我運行'python2。/ script',我得到異常,然後如果我運行'python3。/ script',我不會。 – 2010-01-15 23:26:37

回答

4

好這裏是從評論的答案:

看起來像Python沒有與--enable-ipv6配置。

它不應該是一個操作系統的問題,因爲Python 3的作品。即使操作系統沒有IPv6支持,看起來socket.AF_INET6總是可用的(如果它在OS頭文件中定義的話)。參看socketmodule.c,第4433行(在當前的Python 2.6.4源代碼中)。

+0

謝謝。我認爲套接字的存在。AF_INET6表示已啓用IPv6。 – 2010-01-16 00:11:35

+0

這是非常有用的,爲我工作。但是......「--enable-ipv6」選項在哪裏記錄?它不在'README'中。 – Russ 2011-03-06 07:58:53

+0

對於像我這樣沒有在任何地方看到「--enable-ipv6」配置選項的人,嘗試執行'./configure --help'。它顯示的配置選項比'README'中顯示的配置選項更多(我認爲這在後見之明中有所幫助)。 – Russ 2011-03-06 08:10:49

2

在我的Mac(Mac OS X 10.5.8)上可以正常運行2.6.4 - 不幸的是我無法降級到2.6.2,我也沒有任何openSUSE來檢查錯誤是從哪裏來的。你可以嘗試2.6.4並從源代碼構建來查看bug是否消失,或者查看一些openSUSE特定的bug跟蹤器......?至少我們知道這不是一個通用的Python 2.6錯誤(至少具有最新的,固定版本的2.6版本)...

3

聽起來像那個特定的Python沒有在IPv6支持下編譯。

在這種情況下,您可以下載該版本的源代碼,並構建一個兼容的Python。您甚至可以在Debian軟件包中進行一些編輯並升級系統python。