Topic: interazione con Subprocess con python3  (Letto 317 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline markolino

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
interazione con Subprocess con python3
« il: Dicembre 12, 2018, 22:33 »
Ciao ragazzi,
sto lavorando su un raspberry e chiedo il vostro supporto riguardo al modulo subprocess del linguaggio python.
Praticamente il mio scopo è, a runtime, quello aprire una nuova shell, scriverci dentro un comando ed eseguirlo.
Visto che è un comando in cui faccio streaming, dopo un certo tempo dovrei chiuderlo (chiudere la shell aperta) e proseguire con il resto del codice che lo ha invocato.
Ho provato a guardare un po la documentazione, e sono riuscito ad avviare un nuovo processo:

import subprocess
process = subprocess.Popen(['lxterminal'])


ma non riesco a capire come passargli un comando da eseguire  ;(
Il comando è questo, non fa nient'altro che andare in streaming con la rasp camera utilizzando vlc:

stream = "raspivid -o - -a 12 -w 320 -h 280 -p 0,0,320,280 -t 5000 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264"


Grazie per il supporto,
Saluti  ;)
« Ultima modifica: Dicembre 12, 2018, 22:38 da markolino »

Offline bebo

  • python erectus
  • ***
  • Post: 195
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:interazione con Subprocess con python3
« Risposta #1 il: Dicembre 13, 2018, 10:27 »
Scusa, ma anziche' aprire il terminale, non puoi lanciare direttamente il comando dentro a popen?

Inoltre, ti consiglio di leggere (o rileggere meglio) la documentazione di subprocess: https://docs.python.org/3/library/subprocess.html
Ho paura che quella pipe non funzionera', e prima di provare a giocare con il parametro shell=, leggiti la sezione sui problemi di sicurezza.

Offline markolino

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Re:interazione con Subprocess con python3
« Risposta #2 il: Dicembre 13, 2018, 11:24 »
Ciao e grazie per la risposta.
Ho provato ad usare anche:
os.system("raspivid -o - -a 12 -w 320 -h 280 -p 0,0,320,280 -t 5000 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264")
print("ciao")

e il comando parte...il problema è che il codice che lo ha invocato si pianta e la stampa del "ciao" non viene mai realizzata.
Ho provato a leggere la documentazione, ma non sono riuscito a capire come risolvere il problema.
Grazie

Offline bebo

  • python erectus
  • ***
  • Post: 195
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:interazione con Subprocess con python3
« Risposta #3 il: Dicembre 13, 2018, 11:35 »
No, nella documentazione di subprocess c'e' scritto che subprocess vuole SOSTITUIRE os.system, che ha vari problemi.
Prova a rileggerla meglio.

Offline markolino

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Re:interazione con Subprocess con python3
« Risposta #4 il: Dicembre 13, 2018, 12:35 »
si ho letto che è deprecato, ma oramai avevo già provato  :thinking:
In ogni caso provo a rileggere, se nel frattempo a qualcuno viene qualche idea su come fare questa cosa gliene sarei grato  :caffè:

Offline bebo

  • python erectus
  • ***
  • Post: 195
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:interazione con Subprocess con python3
« Risposta #5 il: Dicembre 13, 2018, 14:12 »
Si blocca molto probabilmente perche' le pipe non funzionano in os.system.
Questa e' la prima cosa che e' uscita con una ricerca con: 'python os system pipe'
https://stackoverflow.com/questions/3197509/redirecting-stdio-from-a-command-in-os-system-in-python

Se stai usando python >= 3.5, prova con subprocess.run, dovrebbe essere ancora piu' facile di Popen.

Offline markolino

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Re:interazione con Subprocess con python3
« Risposta #6 il: Dicembre 13, 2018, 15:11 »

from subprocess import Popen, PIPE
stream = "raspivid -o - -a 12 -w 320 -h 280 -p 0,0,320,280 -t 10000 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264"
test = "lxterminal -e sudo nano  /home/pi/Desktop/New.txt"
photo = "raspistill -o /home/pi/cam.jpg -w 1368 -h 720 -p 0,0,320,280"
video = "raspivid -o vid.h264"
p = Popen(shlex.split(stream), stdout=None, stderr=None, stdin=None)


funzionano tutti i comandi, eccetto quello di stream, che non viene eseguito.
Sia photo, video e anche test che apre in shell un file di testo, vengono portati a termine senza problemi.

Offline bebo

  • python erectus
  • ***
  • Post: 195
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:interazione con Subprocess con python3
« Risposta #7 il: Dicembre 13, 2018, 16:06 »
Qual'e' la differenza tra il tuo codice e quello di quella risposta di StackOverflow?
from subprocess import Popen, PIPE

p = Popen(['command', 'and', 'args'], stdout=PIPE, stderr=PIPE, stdin=PIPE)

output = p.stdout.read()
p.stdin.write(input)


Vedi che non usa delle pipe? Vedi quelle due ultime righe?

Offline markolino

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Re:interazione con Subprocess con python3
« Risposta #8 il: Dicembre 14, 2018, 11:28 »
Qual'e' la differenza tra il tuo codice e quello di quella risposta di StackOverflow?
from subprocess import Popen, PIPE

p = Popen(['command', 'and', 'args'], stdout=PIPE, stderr=PIPE, stdin=PIPE)

output = p.stdout.read()
p.stdin.write(input)


Vedi che non usa delle pipe? Vedi quelle due ultime righe?

Quindi le pipe non le uso, ma utilizzo delle variabili per leggere quello che il processo butta fuori o scrivere qualcosa al processo come input.
Nel mio caso però non capisco come potrei implementare il codice. Puoi farmi un esempio ?
Grazie

Offline bebo

  • python erectus
  • ***
  • Post: 195
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:interazione con Subprocess con python3
« Risposta #9 il: Dicembre 14, 2018, 14:45 »
A occhio dovrebbe essere:

from subprocess import Popen, PIPE
stream = "raspivid -o - -a 12 -w 320 -h 280 -p 0,0,320,280 -t 10000"
clvc = "cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264"

p = Popen(stream.split(), stdout=PIPE)
Popen(clvc, stdin=p.stdout)


Non l'ho provato, non avendo il tuo setup.

Offline markolino

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Re:interazione con Subprocess con python3
« Risposta #10 il: Dicembre 14, 2018, 15:54 »
A occhio dovrebbe essere:

from subprocess import Popen, PIPE
stream = "raspivid -o - -a 12 -w 320 -h 280 -p 0,0,320,280 -t 10000"
clvc = "cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264"

p = Popen(stream.split(), stdout=PIPE)
Popen(clvc, stdin=p.stdout)


Non l'ho provato, non avendo il tuo setup.
Butta fuori un eccezione di FileNotFound.  Che diavolo di file vuole ? Però vedo che il comando parte e lo streaming rimane aperto.
Approfitto per chiederti...ma con quelle due righe starti 2 processi diversi che sono legati dal fatto che l'output di p diventa l'input dell'altro processo ?
FileNotFoundError: [Errno 2] No such file or directory: "cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264"


Ho provato questo e funziona, ma solo dal main thread.

from subprocess import call
call([stream], shell=True)]

Ti ringrazio del supporto  :ok: