Pregunta

Estoy tratando de utilizar os.system () para llamar a otro programa que toma un un archivo de salida y de entrada. El comando que utilizo es ~ 250 caracteres debido a los nombres de las carpetas largas.

Cuando intento llamar al comando, estoy recibiendo un error: The input line is too long

.

supongo que hay una 255 character limit (su base mediante una llamada al sistema C, pero no pude encontrar los límites de esta tampoco).

He intentado cambiar el directorio con os.chdir() para reducir la longitud de pista de carpeta, pero cuando intento utilizar os.system() con "..\folder\filename" al parecer no puedo manejar nombres de rutas relativas. ¿Hay alguna manera de conseguir alrededor de este límite o conseguir que se reconozca rutas relativas?

¿Fue útil?

Solución

Debe usar el módulo de subproceso en su lugar. Ver este poco doc para saber cómo reescribir os.system llamadas a utilizar subproceso .

Otros consejos

A pesar de que es una buena idea usar subprocess.Popen(), esto no resuelve el problema.

Su problema no es el límite de 255 caracteres , esto era cierto en los tiempos de DOS, más tarde aumentó a 2048 para Windows NT / 2000, y aumentó de nuevo en 8192 para Windows XP +.

La solución real es para solucionar un error muy antiguo en las API de Windows: _ popen () y _wpopen () .

Si alguna vez utiliza las cotizaciones durante la línea de comandos que hay que añadir el comando completo en quoates o se obtendrá el mensaje de error The input line is too long.

Todos los sistemas operativos de Microsoft Windows XP que empiezan con caracteres tenían un límite de 8192, que ahora es suficiente para cualquier uso de la línea de comandos decente, pero se olvidaron de resolver este error.

Para superar su error acaba de incluir a toda su comando entre comillas dobles , y si quieres saber más real la comentario MSDN en _popen () .

Tenga cuidado porque estas obras:

prog
"prog"
""prog" param"
""prog" "param""

Pero éstas no funcionarán:

""prog param""

Si necesita una función que se le añade las comillas cuando se necesitan se puede tomar el de http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py

Debe utilizar subproceso en lugar de os.system.

subproceso tiene la ventaja de ser capaz de cambiar el directorio para usted:

import subprocess
my_cwd = r"..\folder\"
my_process = subprocess.Popen(["command name", "option 1", "option 2"], cwd=my_cwd)
my_process.wait() # wait for process to end
if my_process.returncode != 0:
    print "Something went wrong!"

El módulo subproceso contiene algunas funciones auxiliares, así si lo anterior parece un poco prolijo.

Si se asume que está utilizando ventanas, desde las barras invertidas, se podría escribir un archivo .bat de pitón y luego os.system() en eso. Es un truco.

Asegúrese de que cuando estás usando '\' en las cadenas que están siendo escaparon correctamente.

Python utiliza el '\' como carácter de escape, por lo que la cadena se evalúa como "..\folder\filename" "..folderfilename" desde un F escapado sigue siendo una f.

Es posible que desee utilizar

r"..\folder\filename"

o

"..\\folder\\filename"

Me dieron el mismo mensaje pero era extraño, porque la orden no era tan largo (130 caracteres) y se utiliza para trabajar, simplemente dejó de funcionar un día. Acabo de cerrar la ventana de comandos y abrir uno nuevo y funcionó. He tenido la ventana de comandos abierta durante mucho tiempo (quizá meses, es una máquina virtual a distancia). Supongo que es un poco de ventanas error con un buffer o algo así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top