2010-01-15 5 views
4

J'essaie d'activer IPv6 dans une application Python 2 et j'ai des problèmes. Chaque fois que j'essaie de lier à un socket IPv6, une exception socket.error: getsockaddrarg: bad family est levée. Je peux reproduire l'erreur simplement en faisant:Python 2 et IPv6

import socket 

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

Ce code fonctionne bien si je cours en Python 3. Malheureusement, le script aurait besoin d'un effort de portage important de travailler en Python 3 et je préfère ne pas avoir à faire ça encore.

Y at-il quelque chose que je dois faire pour que IPv6 fonctionne en Python 2 ou suis-je S-O-L?

Détails: Python 2.6.2 (R262: 71600, le 24 octobre 2009, 03:16:31) [GCC 4.4.1 [gcc-4_4-branche révision 150839]] sur linux2 (il est le Python qui est partie de l'installation standard d'openSUSE 11.2).

Mise à jour

Après AndiDog m'a aidé à comprendre que socket.AF_INET6 est définie même si IPv6 est pas configuré, j'ai découvert socket.has_ipv6. Ceci est défini comme un booléen et indique si Python a été construit avec IPv6.

+1

Python 2.6.1 fonctionnant sur FreeBSD fonctionne sans problème. – sberry

+0

Est-ce que cela fonctionne avec Python 3 sur le * même * système d'exploitation ou un autre système d'exploitation? – AndiDog

+0

@AndiDog - oui, cela fonctionne sur Python 3 sur le même système d'exploitation. Dans un seul shell (environnement si identique), si j'exécute 'python2./Script', j'obtiens l'exception et si je lance' python3./Script', je ne le fais pas. –

Répondre

4

Ok, voici la réponse des commentaires:

On dirait que Python n'a pas été configuré avec --enable-ipv6.

Cela ne devrait pas être un problème de système d'exploitation car Python 3 fonctionne. Même si le système d'exploitation ne prend pas en charge IPv6, il semble que socket.AF_INET6 soit toujours disponible (s'il est défini dans les fichiers d'en-tête du système d'exploitation). Cf. socketmodule.c, ligne 4433 (dans le code source actuel de Python 2.6.4).

+0

Merci. J'ai supposé que la présence de socket.AF_INET6 a indiqué que IPv6 était activé. –

+0

C'était très utile et a fonctionné pour moi. Mais ... où est l'option '--enable-ipv6' documentée? Ce n'est pas dans le 'README' du tout. – Russ

+0

Pour quelqu'un comme moi qui n'a pas vu l'option de configuration '--enable-ipv6' n'importe où, essayez de faire' ./configure --help'. Il montre plus d'options de configuration que celles révélées dans 'README' (ce qui, je suppose, a du sens en rétrospective?). – Russ

2

Fonctionne très bien avec 2.6.4 sur mon Mac (Mac OS X 10.5.8) - et malheureusement, je ne peux pas rétrograder à 2.6.2 ni avoir d'openSUSE pour vérifier d'où vient le bogue . Pourriez-vous essayer d'obtenir 2.6.4 et de construire à partir de sources pour voir si le bogue disparaît, ou vérifier un bug tracker spécifique à openSUSE ...? Au moins, nous savons que ce n'est pas un bug générique de Python 2.6 (avec la dernière version corrigée de bogues de 2.6, au moins) ...

3

Ce type de Python particulier n'a pas été compilé avec le support IPv6.

Dans ce cas, vous pouvez télécharger la source de cette version et créer vous-même un Python compatible qui fonctionnera. Vous pouvez même être capable d'éditer le paquet Debian et de mettre à jour le système python.