2011-11-23 18 views
6

Tengo el siguiente código:pitón: urllib2 utilizando diferentes interfaz de red

f = urllib2.urlopen(url) 
data = f.read() 
f.close() 

Se ejecuta en una máquina con dos interfaces de red. Me gustaría especificar qué interfaz quiero que use el código. Específicamente, quiero que use el que está diferente al que está usando por defecto ... pero puedo averiguar cuál es cuál si puedo elegir la interfaz.

¿Cuál es la forma más fácil/mejor/más pythonic de hacer esto?

+0

Supongo que no puede cambiar los valores de ruta del sistema para forzar la conexión a su servidor remoto ¿utiliza la otra interfaz? –

+0

@ CédricJulien: Eso funcionaría (si pudiera hacer que todas las conexiones a un sitio web específico pasaran por la otra interfaz), aunque también me interesa saber cómo hacerlo en el código si es posible. – Claudiu

Respuesta

3

Todavía no ha sido una solución completa, pero si estuviera usando sólo los objetos de socket simples, se puede hacer lo que necesita esta manera:

import socket 
s = socket.socket() 
s.bind(("127.0.0.1", 0)) # replace "127.0.0.1" by the local IP of the interface to use 
s.connect(("remote_server.com", 80)) 

Por lo tanto, se forzar al sistema para unir el zócalo para el querido interfaz de red.

+0

Si está utilizando Linux, esta [receta] (http://code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/) será útil para mapa del nombre de la interfaz a la dirección IP. – jcollado

2

Si utiliza Twisted twisted.web.client.Agent, entonces usted puede lograr esto a través de:

from twisted.internet import reactor 
from twisted.web.client import Agent 

agent = Agent(reactor, bindAddress=("10.0.0.1", 0)) 

Y a continuación, utilizando agent de la forma habitual.

+0

gracias, le estaremos dando una mirada – Claudiu

Cuestiones relacionadas