2009-01-02 12 views
6

Actualmente estoy tratando de iniciar una carga de archivo con urllib2 y la biblioteca urllib2_file. Aquí está mi código:Problemas de carga de archivo de pitll urllib2

import sys 
import urllib2_file 
import urllib2 

URL='http://aquate.us/upload.php' 
d = [('uploaded', open(sys.argv[1:]))] 
req = urllib2.Request(URL, d) 
u = urllib2.urlopen(req) 
print u.read() 

He puesto este archivo .py en mi directorio Mis documentos y se coloca un acceso directo a ella en mi carpeta Enviar a (la URL de acceso directo es).

Cuando hago clic derecho en un archivo, selecciono Enviar a, y selecciono Aquate (mi pitón), abre un símbolo del sistema por una fracción de segundo y luego lo cierra. Nada se carga.

Sabía que probablemente había un error, así que escribí el código en CL python, línea por línea. Cuando ejecuté la línea u=urllib2.urlopen(req), no obtuve un error; alt text http://www.aquate.us/u/55245858877937182052.jpg

En su lugar, el cursor simplemente comenzó a parpadear en una nueva línea debajo de esa línea. Esperé un par de minutos para ver si algo pasaría, pero simplemente me quedé así. Para que pare, tuve que presionar ctrl + break.

¿Qué pasa con este script?

¡Gracias de antemano!

[Editar] Olvidé mencionar - cuando ejecuté el script sin los datos de solicitud (el archivo) se ejecutó como un amuleto. ¿Es un problema con urllib2_file?

[editar 2]:

import MultipartPostHandler, urllib2, cookielib,sys 
import win32clipboard as w 
cookies = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),MultipartPostHandler.MultipartPostHandler) 
params = {"uploaded" : open("c:/cfoot.js") } 
a=opener.open("http://www.aquate.us/upload.php", params) 
text = a.read() 
w.OpenClipboard() 
w.EmptyClipboard() 
w.SetClipboardText(text) 
w.CloseClipboard() 

Ese código funciona como un encanto si se ejecuta a través de la línea de comandos.

Respuesta

2

Si está utilizando Python 2.5 o posterior, urllib2_file es innecesario y no es compatible, por lo que debe verificar qué versión está usando (y tal vez actualizar).

Si está utilizando Python 2.3 o 2.4 (las únicas versiones compatibles con urllib2_file), intente ejecutar the sample code y vea si tiene el mismo problema. Si es así, es probable que haya algún problema con la instalación de Python o urllib2_file.

EDIT:

Además, no parece estar utilizando cualquiera de los dos formatos soportados urllib2_file 's para los datos POST. Trate de usar una de las dos líneas siguientes en su lugar:

d = ['uploaded', open(sys.argv[1:])] 
## --OR-- ## 
d = {'uploaded': open(sys.argv[1:])} 
+0

Usted dice que urllib2_file no es necesario en Python 2.5 y posteriores, pero esta funcionalidad aún no existe en python. Basado en http://bugs.python.org/issue3244, las cargas multipart/form-data pueden estar aquí en 2.7, pero aún no están publicadas. – archbishop

+0

No he visto el problema desde que publiqué esto hace más de un año, pero en ese momento, pude duplicar la funcionalidad de urllib2_file en Python 2.6 e incluso la página de la biblioteca dice que solo es necesaria para Python 2.3 y 2.4. Solo puedo suponer que el error se refiere a un problema separado (pero probablemente muy relacionado). :-) –

+0

El enlace al código de muestra es un enlace muerto. – neowulf33

0

En primer lugar, hay una tercera forma de ejecutar programas escritos en Python.

De cmd.exe, tipo python myprogram.py. Obtienes un buen registro. No tiene que escribir cosas una línea a la vez.

En segundo lugar, consulte la documentación urrlib2. También deberá mirar urllib.

Una solicitud requiere una URL y un búfer codificado urlencoded de datos.

datos deben ser un tampón en el formato urlencoded-x-www-form application/estándar . La función urllib.urlencode() toma una asignación o secuencia de 2-tuples y devuelve una cadena en este formato.

Es necesario codificar sus datos.

0

Si todavía estás en python2.5, lo que funcionó para mí fue a descargar el código aquí:

http://peerit.blogspot.com/2007/07/multipartposthandler-doesnt-work-for.html

y guardarlo como MultipartPostHandler.py

utilizan a continuación:

import urllib2, MultipartPostHandler 

opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler()) 
opener.open(url, {"file":open(...)}) 

o si necesita las cookies:

import urllib2, MultipartPostHandler, cookielib 

cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), MultipartPostHandler.MultipartPostHandler()) 
opener.open(url, {"file":open(...)})