Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-11-2012, 15:58   #1
demos88
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'))
Come qualcuno può avere intuito, ho a che fare con 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
Grazie
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2012, 20:21   #2
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2012, 22:22   #3
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da cdimauro Guarda i messaggi

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.
L'avevo già provato questo stratagemma ma non trovo l'output di salloc nel stdout del subprocesso. L'output di salloc, che presumo non venga da salloc in se, ma da un demone avviato da salloc, che è quindi un altro processo (che potrei definire il sub-subprocesso), me lo trovo invece nella console da cui lancio lo script python, è come se bypassasse il stdout del suprocesso.
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:
Originariamente inviato da cdimauro Guarda i messaggi
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.
Si, è il communicate() se non sbaglio. Il comando ha però un "problema": trasferisce una stringa (il comando) e ne riceve l'output, ma poi killa il subprocesso. Infatti se lo uso, ottengo pure la notifica della revoca dell'allocazione (quando il subprocesso muore, il manager slurm considera terminato il job e lo chiude...). E invece a me serve tenere allocato il nodo del cluster per tempo indeterminato per eseguire un arbitrario numero di srun (per questo uso slurm.stdin.write(), che è un modo di comunicare un po' più "grezzo" ).

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 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight

Ultima modifica di demos88 : 09-11-2012 alle 22:25.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2012, 22:37   #4
marco.r
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 10-11-2012, 06:24   #5
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
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
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 10-11-2012, 13:24   #6
demos88
Senior Member
 
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
Quote:
Originariamente inviato da marco.r Guarda i messaggi
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.
OMG u are a fcking genious!
Scriveva proprio nell'stderr!
Ora riesco a catturare e gestire l'output!

Quote:
Originariamente inviato da cdimauro Guarda i messaggi
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...
Infatti non mi sarebbe mai venuto in mente di pensare all'stderr che non era mio interesse gestire in modo particolare in quanto è forse più comodo averlo come output diretto per un debug più veloce, almeno in fase di progettazione (tanto gli script sono usati da dottorandi...).

Grazie a entrambi per le risposte, erano due giorni che stavo fermo su questo punto.
__________________
CPU Ryzen 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
5G slicing per le comunicazioni di emerg...
BYD SHARK, 436 CV e fino a 90 km in elet...
Quali sono i migliori produttori di tecn...
Come guardare YouTube senza pubblicit&ag...
Il telescopio spaziale europeo ESA Eucli...
Addio stampa 3D a strati: il metodo che ...
Data center ed energia green: Aruba acqu...
Windows scarica software non richiesto q...
Auto europea, Bloomberg: uno stabiliment...
C'è un'altra app che sfida Google...
Apple testa i chip di memoria cinesi CXM...
GeForce RTX 5000 SUPER: le schede video ...
Crash a raffica per gli utenti di Androi...
Anthropic: la sua IA Mythos scandaglia i...
RxScanner, e non solo: come i piccoli mo...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:41.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v