2013-07-10 10 views
5

Negli ultimi mesi mi sono insegnato a pitone e finalmente sto iniziando a fare alcune cose utili.Utilizzo di python per inviare prompt di comandi

Quello che sto cercando di fare in definitiva è avere uno script python che funge da coda. Cioè, mi piacerebbe avere una cartella con un mucchio di file di input che un altro programma usa per eseguire calcoli (io sono un fisico teorico e faccio molti lavori di calcolo al giorno).

Il modo in cui devo farlo ora è mettere tutti i file di input sulla scatola che ha il software di calcolo. Quindi devo convertire i file di input dos in unix (dos2unix), in seguito devo copiare il nuovo file di input in un file chiamato "INPUT". Finalmente eseguo un comando che avvia il lavoro.

Tutte queste attività vengono gestite in un prompt dei comandi. La mia domanda è come interfacciare il mio programma con il prompt dei comandi? Quindi, come posso monitorare il processo (che normalmente faccio tramite l'utilizzo della cpu e il comando TOP), e ho Python avviare il lavoro successivo non appena termina l'ultimo lavoro.

Ci scusiamo per il vagabondaggio, non so come controllare un prompt dei comandi da uno script, e poi lo faccio automaticamente 'guardare' il lavoro.

Grazie

+4

Penso che il [sottoprocesso] (http://docs.python.org/2/library/subprocess.html) modulo sia quello che vuoi. È una buona domanda, ti darò questo, ma ci sono molti [duplicati] (http://stackoverflow.com/q/89228/645270) di esso qui su SO. – keyser

+0

Quello che stai veramente chiedendo - controllare un prompt dei comandi da uno script - è difficile. Ma quando il prompt dei comandi che stai cercando di controllare (in questo caso, la shell) non sta facendo nulla che non puoi fare più facilmente in Python (in questo caso, con 'sottoprocesso'), non hai bisogno di controlla il prompt. – abarnert

risposta

6

Il modulo subprocess ha molti strumenti per l'esecuzione dei comandi di sistema in pitone.

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

source

chiamata attenderà il comando per terminare e restituisce il suo codice di ritorno, in modo da poter chiamare un altro poi, sapendo che quello precedente è terminato.

os.system è un modo vecchio per farlo, ma ha meno strumenti e non è raccomandato:

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

modificare FVD ha lasciato un commento explaning come "guardare" il processo di seguito

+0

E all'interno del sottoprocesso è possibile utilizzare Popen.communicate (input = None) per "sorvegliare" il lavoro, come indicato dall'OP. – FvD

+0

In che modo 'os.system' è più semplice di' subprocess.call'? È lo stesso numero di concetti (e lo stesso numero di sequenze di tasti) in casi banali, e più complicato non appena viene fuori qualcos'altro (come argomenti con spazi in essi). – abarnert

+0

Deja vu principale dal duplicato Ho collegato a: p (con la discussione 'os.system') – keyser

1

Se è effettivamente necessario guidare un'interfaccia della riga di comando interattiva, non c'è modo di farlo con lo stdlib.

Esistono diverse opzioni di terze parti; Penso che lo pexpect sia probabilmente il più popolare.


Tuttavia, se non si ha realmente bisogno di guidare in modo interattivo, se il programma che si ha solo bisogno di dare argomenti sulla riga di comando, o di una "modalità batch" scaricare al suo standard input, poi subprocess lo rende facile. Ad esempio, per guidare il programma sort, si può semplicemente fare questo:

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

Questo è, naturalmente, un esempio stupido, perché si può fare nulla sort può fare con Python di sorted con un argomento key, e probabilmente un sacco più leggibile.


Più in generale: spesso quando si pensa è necessario in modo interattivo lo script qualche programma, davvero non, ea volte non hanno nemmeno bisogno di farlo funzionare a tutti.

E il tuo caso particolare è esattamente un caso del genere. Stai chiedendo di script interattivo della shell. Ma non hai bisogno di farlo, perché Python può fare tutto ciò che ti serve dalla shell.

Problemi correlati