django wsgi + Popen + svn checkout

Por alguna razón, necesito echar un vistazo a una carpeta de código fuente desde una vista django, y uso 'Popen' para esto.

Todo funciona bien y funciona perfectamente cuando se usa django runserver .

Sin embargo, después de implementar el código en apache2 + wsgi, el Popen no funciona correctamente. Siempre regresa antes de que el command esté realmente terminado. Tampoco arroja un error, simplemente arroja resultados completos, y revisé las carpetas desprotegidas, también están incompletas.

Todo el process de comprobación de svn tomó aproximadamente 5-6 segundos, y la salida estándar es bastante grande (alnetworkingedor de 3000 caracteres).

Sé que hay una biblioteca de pysvn, pero parece difícil de instalar en un server ubuntu obsoleto.

Y, básicamente, es lo único que tengo atrapado ahora.

El código que utilicé para llamar a la salida es el siguiente:

def run_cmd(argument_list, output_file = None): print "arguments", argument_list p = subprocess.Popen(argument_list, stdout=subprocess.PIPE) content = "" while True: line = p.stdout.read(50) if not line: break content += line if output_file: fout = file(output_file, "w") fout.write(content) fout.close() return content output = run_cmd(["/usr/bin/svn", "--ignore-externals", "co", svn_url, src_folder] ) 

Aquí hay alguna información que puede ser útil:

  1. número de files para verificar: alnetworkingedor de 3000
  2. time necesario para realizar el check out: alnetworkingedor de 5-6 segundos (solo location SVN basada en files)
  3. versión de Python: 2.6.4
  4. Versión django: 1.1.2
  5. versión mods wsgi: 3.3

Me he quedado atrapado en esto por horas, ¡cualquier pista es muy apreciada!

Gracias.

vale, después de luchar por otras 3 horas hoy. Finalmente he resuelto el problema.

Esto es lo que está pasando, el wsgi y el popen están realmente bien, el verdadero problema es que algunos files de código fuente para el control en realidad tienen caracteres especiales y que rompen el process de comprobación de svn (con el siguiente error)

svn: No se puede convertir una cadena de 'UTF-8' a encoding nativa

El wsgi y la console tienen un valor diferente para LC_LANG, y eso explica los diferentes comportamientos entre runserver y wsgi.

finalmente, resolví el problema modificando el file de '/ etc / apache2 / envars' y descomentando la siguiente línea:

. / etc / default / locale

Tenga en count que debe reiniciar el server mediante 'apache2ctl stop' y 'apache2ctl start', en lugar de 'apache2ctl restart', para que la configuration sea efectiva.

De hecho, utilicé Pexpect para descubrir el problema, pero volví a Popen más tarde debido a un problema de latencia obvio.

Aquí está mi código final para run_cmd, y con suerte podría ayudar a alguien más en el futuro:

 def run_cmd(argument_list, output_file = None): print "arguments", argument_list #command = " ".join(argument_list) #content = pexpect.run(command) #if output_file: #fout = file(output_file, "w") #fout.write(content) #fout.close #return content p = subprocess.Popen(argument_list, bufsize=50, stderr=subprocess.STDOUT, stdout=subprocess.PIPE) #showed error message as well content = "" while True: line = p.stdout.read(50) if not line: break content += line #raise Exception(content) #for debug if output_file: fout = file(output_file, "w") fout.write(content) fout.close() return content