2013-07-10 24 views
5

Uczę się Pythona w ciągu ostatnich kilku miesięcy i wreszcie zaczynam robić użyteczne rzeczy.Używanie Pythona do generowania monitów poleceń

Co próbuję w końcu zrobić, to mieć skrypt python, który działa jako kolejka. Chodzi o to, że chciałbym mieć folder zawierający kilka plików wejściowych, które inny program używa do wykonywania obliczeń (jestem fizykiem teoretycznym i wykonuję wiele zadań obliczeniowych dziennie).

Sposób, w jaki teraz muszę to zrobić, to umieszczenie wszystkich plików wejściowych w pudełku z oprogramowaniem obliczeniowym. Następnie muszę przekonwertować pliki wejściowe DOS na unix (dos2unix), po czym muszę skopiować nowy plik wejściowy do pliku o nazwie "INPUT". Wreszcie uruchamiam polecenie, które uruchamia zadanie.

Wszystkie te zadania są obsługiwane w wierszu polecenia. Moje pytanie brzmi: jak połączyć mój program z wierszem poleceń? Następnie, jak mogę monitorować proces (który normalnie robię poprzez użycie procesora i polecenie TOP), i python rozpoczyna następną pracę zaraz po zakończeniu ostatniego zadania.

Przepraszam za przepychanki, po prostu nie wiem, jak sterować wierszem poleceń ze skryptu, a następnie automatycznie go "obserwować".

Dzięki

+4

Myślę, że moduł [subprocess] (http://docs.python.org/2/library/subprocess.html) jest tym, czego potrzebujesz. To dobre pytanie, dam ci to, ale istnieje wiele [duplikatów] (http://stackoverflow.com/q/89228/645270) tutaj na SO. – keyser

+0

To, o co właściwie prosisz - kontrolowanie wiersza polecenia ze skryptu - jest trudne. Ale gdy wiersz polecenia, który próbujesz kontrolować (w tym przypadku, powłoka) nie robi nic, czego nie możesz zrobić łatwiej w Pythonie (w tym przypadku z 'podprocesiem'), nie musisz kontroluj monit. – abarnert

Odpowiedz

6

Moduł subprocess ma wiele narzędzi do wykonywania poleceń systemowych w Pythonie.

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

source

wezwanie będzie czekać na polecenia, aby zakończyć i powrócić jego returnCode, więc można wywołać inną potem wiedząc, że poprzedni zakończył.

os.system jest starszym sposób to zrobić, ale ma mniej narzędzi i nie jest zalecane:

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

edit FVD skomentowało explaning jak "watch" proces poniżej

+0

W podprocesie można użyć Popen.communicate (input = None), aby "obejrzeć" zadanie, jak to określił OP. – FvD

+0

W jaki sposób 'os.system' jest łatwiejsze niż' subprocess.call'? Jest to ta sama liczba pojęć (i mniej więcej ta sama liczba naciśnięć klawiszy) w banalnych przypadkach, i bardziej skomplikowana, jak tylko wszystko inne pojawi się (jak argumenty zawierające spacje). – abarnert

+0

Major deja vu z duplikatu, do którego dołączyłem: p (z dyskusją "os.system") – keyser

1

Jeśli rzeczywiście potrzebujesz prowadzić interaktywny interfejs wiersza poleceń, nie ma możliwości zrobienia tego przy pomocy stdlib.

Istnieje wiele opcji innych firm; Myślę, że najpopularniejsze jest prawdopodobnie pexpect.


Jednakże, jeśli naprawdę nie trzeba go prowadzić interaktywnie, jeśli program tylko potrzebuje, aby nadać jej argumenty w linii poleceń, lub „tryb wsadowy” zrzucić do standardowego wejścia, a następnie subprocess ułatwia to. Na przykład, aby prowadzić program sort, można po prostu to zrobić:

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

To oczywiście głupi przykład, ponieważ można zrobić coś sort można zrobić z Pythona sorted z key argumentu, a prawdopodobnie dużo bardziej czytelnie.


Ogólniej: często podczas myślisz trzeba interaktywnie skrypt jakiś program, na pewno nie, a czasem nawet nie trzeba go uruchomić w ogóle.

I twój konkretny przypadek jest dokładnie taki przypadek. Pytasz o interaktywne wykonywanie skryptów powłoki. Ale naprawdę nie musisz tego robić, ponieważ Python może wykonywać wszystkie potrzebne rzeczy z powłoki.

Powiązane problemy