2010-10-15 5 views
0

J'ai parcouru Internet à la recherche d'une solution à mon problème avec Python. J'essaie d'utiliser une connexion urllib2 pour lire un flux potentiellement infini de données à partir d'un serveur HTTP. Cela fait partie d'une communication interactive, il est donc important que je puisse obtenir les données disponibles, même si ce n'est pas un tampon complet. Il semble y avoir aucun moyen d'avoir read \ readline retourner les données disponibles. Il bloquera pour toujours l'attente du flux entier (sans fin) avant qu'il ne revienne.Prises en Python Constipées urllib2

Même si je mets le descripteur de fichier sous-jacent à non-bloquant en utilisant fnctl, l'objet de fichier urllib2 bloque encore !! En général, il semble qu'il n'y ait aucun moyen de rendre les objets-fichiers python, après read, renvoyer toutes les données disponibles s'il y en a et bloquer autrement.

J'ai vu quelques articles sur des personnes qui cherchaient de l'aide, mais je n'ai vu aucune solution. Ce qui donne? Est-ce que je manque quelque chose? Cela semble être un tel cas d'utilisation normal à complètement ruiner! J'espère pouvoir utiliser la capacité d'urllib2 pour détecter les proxies configurés et utiliser l'encodage en morceaux, mais je ne peux pas le faire si ça ne va pas coopérer.

Edit: Sur demande, voici quelques exemples de code

Client:

connection = urllib2.urlopen(commandpath) 
id = connection.readline() 

Supposons maintenant que le serveur utilise morcelées le codage de transfert, et écrit un morceau sur le flux et le morceau contient les ligne, puis attend. La connexion est toujours ouverte, mais le client a des données en attente dans un tampon.

Je ne peux pas obtenir read ou readline pour retourner les données je sais qu'il a l'attente, car il essaie de lire jusqu'à la fin de la connexion. Dans ce cas, la connexion peut ne jamais se fermer et attendre pour toujours ou jusqu'à ce qu'un délai d'inactivité se produise, coupant la connexion. Une fois la connexion coupée, elle reviendra, mais ce n'est évidemment pas le comportement que je veux.

+0

Je ne suis pas sûr de comprendre correctement ce que vous essayez d'accomplir. Que voulez-vous dire par blocage? Voulez-vous dire que vous souhaitez que votre script continue à s'exécuter lorsque le flux ne fournit plus de données ou quelque chose d'autre? – jsalonen

+0

Veuillez fournir un exemple de code; nous avons besoin au moins de faire une suggestion. – tzot

Répondre

1

urllib2 fonctionne au niveau HTTP, qui fonctionne avec des documents complets. Je ne pense pas qu'il existe un moyen de contourner cela sans piratage dans le code source urllib2. Ce que vous pouvez faire est d'utiliser des sockets simples (vous devrez parler HTTP vous-même dans ce cas), et appelez le sock.recv(maxbytes) qui ne lit que les données disponibles.

Mise à jour: vous pouvez essayer d'appeler conn.fp._sock.recv(maxbytes), au lieu de conn.read(bytes) sur une connexion urllib2.

+0

Le point d'utilisation de la connexion urllib2 est que urllib2 supporte déjà les proxies environnementaux et l'encodage en morceaux, quelque chose que je ne suis pas trop excité à l'idée de m'implémenter. Je me sens comme si je pouvais juste botter quelque chose dans le pantalon au niveau le plus bas tout fonctionnerait ... – jdizzle

+0

Bien, je ne voudrais pas commencer à mettre en œuvre tous ces moi-même non plus. Est-ce que le truc 'conn.fp._sock.recv (maxbytes)' a-t-il été utile? – Wim

+0

En fait, j'ai fini par utiliser conn.fp._sock.fp._sock ou quelque chose de fou comme ça. J'ai dû implémenter un décodeur en morceaux, mais ce n'est pas vraiment difficile.Ce n'était pas avoir à faire face à la question du proxy qui m'a vraiment effrayé. – jdizzle

Questions connexes