Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Saros 20: il robot preciso e molto sottile
Roborock Saros 20: il robot preciso e molto sottile
Il nuovo robot di Roborock per l'aspirazione della polvere e il lavaggio dei pavimenti spicca per immediatezza d'uso e per l'efficacia dell'azione, grazie anche a un ridotto sviluppo in altezza. Saros 20 integra un motore da ben 36.000Pa di potenza e un sistema di lavaggio a due panni rotanti, con bracci estensibili e un sistema di navigazione molto preciso.
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm
ASUS e HIFIMAN uniscono le forze per creare ROG Kithara, cuffie gaming con driver magnetici planari da 100mm, design open-back e microfono MEMS full-band. Una proposta che ambisce a coniugare fedeltà per audiofili e performance ludiche, disponibili a 319 euro
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-11-2012, 16: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 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
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2012, 21: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, 23: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 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 23:25.
demos88 è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2012, 23: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, 07: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, 14: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 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
demos88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Roborock Saros 20: il robot preciso e molto sottile Roborock Saros 20: il robot preciso e molto sott...
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm ASUS ROG Kithara: quando HIFIMAN incontra il gam...
Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Anche Samsung punterà sulle batte...
Volkswagen supera quota 2 milioni di aut...
Pokémon Vento e Onda si mostrano ...
Costa meno di 17€ ma gonfia fino a 150 P...
Il nuovo MacBook entry level potrebbe av...
iPhone 17 a 909€ in tutti i colori: 256G...
Umidità e muffa addio a 99€: ques...
Compri il nuovo Xiaomi 17 e ti regalano ...
NVIDIA diversifica i fornitori di GDDR7:...
Nuovi sconti (e coupon), ecco la top 10 ...
Prezzi in caduta libera sui robot aspira...
Non chiamatelo base: a 198€ questo robot...
Upgrade PC al prezzo giusto: su Amazon t...
Amazon e il paradosso dell'AI: meno dipe...
Meta avrebbe firmato un accordo plurienn...
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: 14:30.


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