2013-07-10 21 views
5

Ich habe mir in den letzten Monaten selbst Python beigebracht und fange nun an, einige nützliche Dinge zu tun.Verwenden von Python zum Ausgeben von Eingabeaufforderungen

Was ich letztendlich versuche, ist ein Python-Skript, das als Warteschlange fungiert. Das heißt, ich hätte gerne einen Ordner mit einer Reihe von Eingabedateien, die von einem anderen Programm zum Ausführen von Berechnungen verwendet werden (ich bin theoretischer Physiker und mache viele Rechenaufgaben pro Tag).

Die Art, wie ich dies jetzt tun muss, ist alle Eingabedateien auf der Box, die die Computer-Software hat. Dann muss ich die DOS-Eingabedateien in Unix (DOS2UNIX) konvertieren, danach muss ich die neue Eingabedatei in eine Datei namens 'INPUT' kopieren. Schließlich führe ich einen Befehl aus, der den Job startet.

Alle diese Aufgaben werden in einer Eingabeaufforderung behandelt. Meine Frage ist, wie kann ich mein Programm mit der Eingabeaufforderung verbinden? Dann, wie kann ich den Prozess überwachen (was ich normalerweise über die CPU-Verwendung und den TOP-Befehl mache), und Python den nächsten Job starten lassen, sobald der letzte Job beendet ist.

Entschuldigung für die Umleitung, ich weiß nur nicht, wie man eine Eingabeaufforderung von einem Skript aus steuert und dann automatisch den Auftrag "überwacht".

Dank

+4

Ich denke, das Modul [Subprozess] (http://docs.python.org/2/library/subprocess.html) ist was Sie wollen. Es ist eine gute Frage, ich gebe dir das, aber es gibt viele [Duplikate] (http://stackoverflow.com/q/89228/645270) davon hier auf SO. – keyser

+0

Was Sie eigentlich verlangen - die Steuerung einer Eingabeaufforderung über ein Skript - ist schwierig. Aber wenn die Eingabeaufforderung, die Sie zu kontrollieren versuchen (in diesem Fall die Shell) nichts tut, was Sie in Python nicht einfacher machen können (in diesem Fall mit "subprocess"), müssen Sie das nicht tun Kontrolliere die Eingabeaufforderung. – abarnert

Antwort

6

Das subprocess Modul viele Werkzeuge zum Ausführen von Systembefehlen in Python hat.

from subprocess import call 
call(["ls", "-l"]) 

source

Anruf wird für den Befehl warten, um seine Rückkehr zu beenden und zurück, so dass Sie ein anderes später anrufen zu wissen, dass die vorherige beendet ist.

os.system ist eine ältere Art und Weise, es zu tun, hat aber weniger Werkzeuge und wird nicht empfohlen:

import os 
os.system('"C:/Temp/a b c/Notepad.exe"') 

bearbeiten FvD Kommentar links explaning, wie man „sehen“, um den Prozess unter

+0

Und innerhalb des Subprozesses können Sie Popen.communicate (input = None) verwenden, um den Job zu "beobachten", wie das OP es nannte. – FvD

+0

Wie ist 'os.system' any einfacher als' subprocess.call'? Es ist die gleiche Anzahl von Konzepten (und etwa die gleiche Anzahl von Tastenanschlägen) in trivialen Fällen und komplizierter, sobald etwas anderes auftaucht (wie Argumente mit Leerzeichen in ihnen). – abarnert

+0

Major deja vu aus dem Duplikat, mit dem ich verlinkt bin: p (mit der 'os.system' Diskussion) – keyser

1

Wenn Sie tatsächlich eine interaktive Befehlszeilenschnittstelle steuern müssen, gibt es keine Möglichkeit, dies mit der stdlib zu tun.

Es gibt eine Reihe von Optionen von Drittanbietern dafür; Ich denke, pexpect ist wahrscheinlich am beliebtesten.


Allerdings, wenn Sie wirklich brauchen es nicht interaktiv-wenn fahren Sie das Programm nur braucht es Argumente auf der Kommandozeile zu geben, oder eine „Batch-Modus“ auf seine Standardeingabe-Dump, dann subprocess macht es einfach. Um zum Beispiel das sort Programm zu fahren, können Sie dies nur tun:

with Popen(['sort', '-n'], stdin=PIPE, stdout=PIPE) as p: 
    sorted_data = p.communicate(input_data) 

Dies ist natürlich ein dummes Beispiel, weil Sie sort alles tun kann, kann sorted mit einem key Argument mit Python tun, und wahrscheinlich viel leserlicher.


Allgemeiner: oft, wenn Sie denken Sie müssen einige Programm interaktiv Skript, die Sie wirklich nicht, und manchmal kann man nicht einmal überhaupt ausgeführt werden müssen.

Und Ihr Fall ist genau so ein Fall. Sie fragen nach interaktivem Scripting der Shell. Aber Sie brauchen das nicht wirklich, denn Python kann alles, was Sie von der Shell brauchen, tun.

Verwandte Themen