Frage

Ich versuche, OS.System () zu verwenden, um ein anderes Programm aufzurufen, das eine Eingabe und eine Ausgabedatei nimmt. Der Befehl, den ich verwende, ist ~ 250 Zeichen aufgrund der langen Ordnernamen.

Wenn ich versuche, den Befehl anzurufen, erhalte ich einen Fehler: The input line is too long.

Ich vermute, es gibt eine 255 character limit (Es wurde mit einem C -Systemaufruf erstellt, aber ich konnte die Einschränkungen auch nicht finden).

Ich habe versucht, das Verzeichnis mit zu ändern os.chdir() Um die Ordner -Trail -Längen zu reduzieren, aber wenn ich es versuche, nutze ich os.system() mit "..\folder\filename" Es kann anscheinend nicht mit relativen Pfadnamen umgehen. Gibt es eine Möglichkeit, dieses Limit umzugehen oder relative Wege zu erkennen?

War es hilfreich?

Lösung

Sie sollten stattdessen das Subprozess -Modul verwenden. Sehen Dies Little Doc, wie man OS.System -Aufrufe zur Verwendung von Subprozess neu schreiben.

Andere Tipps

Auch es ist eine gute Idee zu verwenden subprocess.Popen(), Dies löst das Problem nicht.

Ihr Problem ist nicht das Grenzwert von 255 Zeichen, Dies galt bei DOS Times, später für Windows NT/2000 auf 2048 und wurde für Windows XP+erneut auf 8192 erhöht.

Das Echte Lösung ist zu einem sehr alten Fehler in Windows -APIs zu arbeiten: _popen () und _wpopen ().

Wenn Sie während der Befehlszeile jemals Zitate verwenden, müssen Sie den gesamten Befehl in Quoates hinzufügen, oder Sie erhalten die The input line is too long Fehlermeldung.

Alle Microsoft -Betriebssysteme, beginnend mit Windows XP, hatten ein Grenzwert von 8192 Zeichen, was jetzt für jede anständige Befehlszeilenverbrauch ausreicht, aber sie haben vergessen, diesen Fehler zu lösen.

Um ihren Fehler zu überwinden Fügen Sie einfach Ihren gesamten Befehl in doppelte Zitate ein, und wenn Sie realer wissen wollen Msdn Kommentar zu _popen ().

Seien Sie vorsichtig, weil diese funktionieren:

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

Aber diese werden nicht funktionieren:

""prog param""

Wenn Sie eine Funktion benötigen, die die Zitate hinzufügt, wenn sie benötigt werden http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py

Du solltest benutzen Subprozess anstelle von os.System.

Subprozess hat den Vorteil, das Verzeichnis für Sie zu ändern:

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

Das Subprozessmodul enthält auch einige Helferfunktionen, wenn das oben genannte etwas ausführlich aussieht.

Angenommen, Sie verwenden Windows, aus den Backslashes, können Sie eine .bat -Datei von Python und dann schreiben os.system() auf diesem. Es ist ein Hack.

Stellen Sie sicher, dass Sie in Ihren Saiten "" verwenden, damit sie richtig entkommen werden.

Python verwendet das '' als Escape -Zeichen, also die Saite "..\folder\filename" bewertet "..folderfilename" Da ein entkommener F immer noch ein f ist.

Sie möchten wahrscheinlich verwenden

r"..\folder\filename"

oder

"..\\folder\\filename"

Ich bekam die gleiche Botschaft, aber es war seltsam, weil der Befehl nicht so lang war (130 Zeichen) und es früher funktioniert hat, es wurde einfach aufgehört, eines Tages zu arbeiten. Ich habe gerade das Befehlsfenster geschlossen und einen neuen geöffnet und es hat funktioniert. Ich habe das Befehlsfenster schon lange geöffnet (vielleicht Monate, es ist eine abgelegene virtuelle Maschine). Ich denke, ein Windows -Fehler mit einem Puffer oder so.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top