Domanda

Sto cercando di utilizzare os.system () per chiamare un altro programma che richiede un un file di output di input e. Il comando che uso è ~ 250 caratteri a causa dei nomi di cartella lunghi.

Quando provo a chiamare il comando, sto ottenendo un errore: The input line is too long

.

Sto indovinando c'è un 255 character limit (la sua costruito utilizzando una chiamata di sistema C, ma non riuscivo a trovare le limitazioni che o).

Ho provato a cambiare la directory con os.chdir() per ridurre il sentiero lunghezze delle cartelle, ma quando provo utilizza os.system() con "..\folder\filename" a quanto pare non riesco a gestire i nomi di percorso relativi. C'è un modo per aggirare questo limite o scarica di riconoscere i percorsi relativi?

È stato utile?

Soluzione

Si consiglia di utilizzare invece il modulo sottoprocesso. Vedere questo piccola doc per come riscrivere os.system chiamate a utilizzare il sottoprocesso .

Altri suggerimenti

Anche è una buona idea usare subprocess.Popen(), questo non risolve il problema.

Il tuo problema non è i 255 caratteri limite , questo era vero sui tempi del DOS, successivamente aumentato a 2048 per Windows NT / 2000, ed ha aumentato di nuovo a 8192 per Windows XP +.

Il vera soluzione è quello di aggirare un vecchio bug nel API di Windows: _ popen () e _wpopen () .

Se mai utilizzare le virgolette durante la riga di comando è necessario aggiungere l'intero comando in quoates o si otterrà il messaggio di errore The input line is too long.

Tutti i sistemi operativi Microsoft a partire da Windows XP hanno un limite di 8192 caratteri che ora è sufficiente per qualsiasi utilizzo della riga di comando decente, ma si sono dimenticati di risolvere questo bug.

Per superare il loro bug semplicemente includere il tuo intero comando tra virgolette , e se volete saperne di più reale la MSDN commento sulla _popen () .

Bisogna fare attenzione perché queste opere:

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

Ma questi non funzioneranno:

""prog param""

Se avete bisogno di una funzione che fa aggiungere le virgolette quando sono necessari si può prendere quello da http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py

Si dovrebbe usare sottoprocesso invece di os.system.

sottoprocesso ha il vantaggio di essere in grado di modificare la directory per voi:

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!"

Il modulo sottoprocesso contiene alcune funzioni di supporto e se quanto sopra sembra un po 'prolisso.

Supponendo che si sta usando Windows, dal backslash, si potrebbe scrivere un file .bat in pitone e poi os.system() su questo. Si tratta di un hack.

Assicurarsi che quando si sta utilizzando '\' nelle stringhe che stanno venendo adeguatamente sfuggiti.

Python usa il '\' come carattere di escape, quindi la stringa di "..\folder\filename" restituisce "..folderfilename" poiché un f sfuggito è ancora una f.

Probabilmente si desidera utilizzare

r"..\folder\filename"

o

"..\\folder\\filename"

ho ottenuto lo stesso messaggio ma è stato strano perché il comando non è stato molto tempo (130 caratteri) ed è abituato a lavorare, semplicemente smesso di lavorare un giorno. Ho appena chiuso la finestra di comando e ha aperto uno nuovo e ha funzionato. Ho avuto la finestra di comando aperto per molto tempo (forse mesi, è una macchina virtuale a distanza). Credo sia un po 'di finestre bug con un buffer o qualcosa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top