|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
[Python/Linux] Redirect stdout
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): Codice:
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')) 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 ![]() Grazie
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Ho lavorato poco col modulo subprocess, e non posso fare qualche prova con Linux.
Comunque su due piedi, potresti provare a leggere l'output subito dopo che hai lanciato il comando salloc? Per adesso commenta tutte le altre righe, e vedi se riesci a intercettare l'output di salloc. Fatto questo, poi aggiungerai le rimanenti righe. Altra cosa, mi sembra che ci sia qualche funziona (o metodo di Popen, purtroppo non ricordo bene adesso) che ti consente di lanciare un comando e di recuperare l'output. Può darsi che sia sufficiente per quello che ti serve.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#3 | ||
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Insomma, l'output del demone lanciato da salloc me lo becco direttamente nella shell più esterna e ignora la pipe del suprocesso (quello che ho chiamato "slurm"). Quote:
Una bella gatta da pelare eh? ![]() Purtroppo è inerente la mia tesi di laurea per cui devo riuscirci in qualche modo! grazie per la risposta ![]()
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight Ultima modifica di demos88 : 09-11-2012 alle 22:25. |
||
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
la mia ipotesi e' che il programma scriva su stderr invece che stdout.
hai provato a impostare un canale diverso per stderr ? Il fatto che sia un sottoprocesso di un altro processo e' irrilevante, penso. Standard input e output vengono solitamente "ereditati" dal processo padre.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Idem. Non mi vengono in mente altre possibilità, proprio perché i descrittori dei file sono condivisi, per cui tutto dovrebbe poter essere controllabile da subprocess.
Ma è strano che un programma o demone utilizzi stderr per quello che dovrebbe essere un normale output, per lo meno da quel che ha descritto demos88. In genere lo si usa per warning ed errori...
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#6 | ||
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Scriveva proprio nell'stderr! ![]() Ora riesco a catturare e gestire l'output! Quote:
Grazie a entrambi per le risposte, erano due giorni che stavo fermo su questo punto. ![]()
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:32.