Python no obtiene IP si el cable se conecta después de que el script haya comenzado

Espero que esto no se cruce en territorio de superusuario.

Así que tengo un Linux incrustado, donde los procesos del sistema son naturalmente bastante reducidos. No estoy muy seguro de qué proceso del sistema supervisa a la capa física e inicia un cliente dhcp cuando el cable de red está conectado, pero yo mismo hice uno. ¨ El problema es que si tengo una secuencia de comandos de Python, si utilizo conexiones http, que se ejecuta antes de tener una dirección IP, nunca obtendrá una conexión. Incluso después de tener una IP válida, el python todavía tiene

“Error temporal en la resolución de nombres”

Entonces, ¿cómo puedo hacer que Python se dé cuenta de la nueva conexión disponible, sin reiniciar el script?

Alternativamente, me estoy perdiendo algún procedimiento normal que Linux se ejecuta normalmente en la conexión del cable de red.

El cliente dhcp que estoy usando es udhcpc y la versión de Python es 2.6. Usando httplib para conexiones.

Suena como httplib almacena en caché /etc/resolv.conf que se actualiza después de que su cliente DHCP obtiene una IP.

Podría considerar escribir un script de envoltura que espere hasta que se obtenga una dirección IP, luego llame a su script de python.

Alternativamente, podría intentar, dentro de su script de Python, no abrir ninguna conexión de socket hasta que haya adquirido una dirección IP y /etc/resolv.conf actualizado.

Editar

httplib usa socket.create_connection() que, después de algunas búsquedas, encontré hace caché /etc/resolv.conf . (Bueno, parece que la versión incrustada de libc en realidad está haciendo el almacenamiento en caché).

Puedes probar la solución de SugarLabs , aunque no puedo hablar de su eficacia.

Es posible que uno de los módulos de Python almacene en caché el estado de la red, por lo que no utiliza la configuración más reciente. Intenta y vuelve a cargar todos los módulos relacionados con la red. Un ejemplo simple de esto es:

 import sys, socket, urllib for i in [sys, socket, urllib]: reload(i) 

Si eso no funciona, mire a su alrededor en sys.modules para ver qué más se importó e intente más módulos allí. Una versión más extrema de la recarga sería el siguiente código, que puedes probar como último esfuerzo de zanja.

código

 import sys print 'reloading %s modules ' % len(sys.modules) for name, module in sys.modules.items(): try: reload(module) except: print 'failed to import %s' % name 

salida

 reloading 42 modules failed to import __main__ failed to import encodings.encodings failed to import encodings.codecs failed to import lazr failed to import encodings.__builtin__ 

Después de mucha más investigación, el problema de glibc que Jedwards sugirió, parecía ser el problema. No encontré una solución, pero hice una solución para mi caso de uso. Teniendo en cuenta que solo uso una URL, agregué mi propio “resolv.file”. Un pequeño demonio obtiene la dirección IP de la URL cuando PHY informa que el cable está conectado. Esta IP se guarda en “mi propio resolv.conf”. Desde este archivo, el script de python recupera la IP que se usará para las publicaciones.

No es realmente una buena solución, sino una solución.