demos88
09-11-2012, 15:58
Ciao, lavorando a un progetto universitario mi sono trovato di fronte a un problema relativo all'apertura da python di subprocessi e gestione del relativo output.
Ecco il codice (grammatica del Python 3.2):
slurm = Popen("salloc -c1 -n1 ",shell=True,stdin=PIPE,stdout=PIPE)
slurm.stdin.write(bytes("srun java -jar /path/to/jarfile/jarfile.jar &\n",'ascii'))
print (str(slurm.stdout.readline(),'ascii'))
Come qualcuno può avere intuito, ho a che fare con SLURM (https://computing.llnl.gov/linux/slurm/) la cui conoscenza comunque non è indispensabile per risolvere il mio problema.
Nella prima riga domando l'allocazione di un nodo usando il metodo Popen() di Python avviando un subprocesso, nella seconda passo al subprocesso il comando srun per avviare il jar che mi interessa.
La terza riga è di debug per vedere cosa effettivamente leggo dalla pipe del processo.
Il mio problema è semplice: con Popen apro praticamente una shell nella quale eseguo i comandi salloc e srun. Però quando eseguo salloc, ottengo in console l'output che invece non vorrei visualizzare ma catturare con la pipe e processare (perchè l'output di salloc mi dice l'id del job allocato, e mi serve).
Invece l'output del file jar non viene mandato in console e lo posso leggere leggendo l'stdout del processo.
Quello che serve a me è che anche l'output di salloc venga nascosto alla console più "alta" (quella dello script python) e venga letto mediante lo stdout del processo avviato dallo script. Penso che il punto cruciale sia il fatto che il comando salloc avvia un ulteriore subprocesso al subprocesso, che quindi è un sub-subprocesso dello script più esterno.
Spero di essere stato abbastanza chiaro, non sono molto esperto dell'ambiente linux :doh:
Grazie
Ecco il codice (grammatica del Python 3.2):
slurm = Popen("salloc -c1 -n1 ",shell=True,stdin=PIPE,stdout=PIPE)
slurm.stdin.write(bytes("srun java -jar /path/to/jarfile/jarfile.jar &\n",'ascii'))
print (str(slurm.stdout.readline(),'ascii'))
Come qualcuno può avere intuito, ho a che fare con SLURM (https://computing.llnl.gov/linux/slurm/) la cui conoscenza comunque non è indispensabile per risolvere il mio problema.
Nella prima riga domando l'allocazione di un nodo usando il metodo Popen() di Python avviando un subprocesso, nella seconda passo al subprocesso il comando srun per avviare il jar che mi interessa.
La terza riga è di debug per vedere cosa effettivamente leggo dalla pipe del processo.
Il mio problema è semplice: con Popen apro praticamente una shell nella quale eseguo i comandi salloc e srun. Però quando eseguo salloc, ottengo in console l'output che invece non vorrei visualizzare ma catturare con la pipe e processare (perchè l'output di salloc mi dice l'id del job allocato, e mi serve).
Invece l'output del file jar non viene mandato in console e lo posso leggere leggendo l'stdout del processo.
Quello che serve a me è che anche l'output di salloc venga nascosto alla console più "alta" (quella dello script python) e venga letto mediante lo stdout del processo avviato dallo script. Penso che il punto cruciale sia il fatto che il comando salloc avvia un ulteriore subprocesso al subprocesso, che quindi è un sub-subprocesso dello script più esterno.
Spero di essere stato abbastanza chiaro, non sono molto esperto dell'ambiente linux :doh:
Grazie