понимание подпроцесса, POPEN и PIPE

Я новичок в python и программировании, и я пытаюсь понять этот код. Я провел последние несколько часов, читая документацию и просматривая видео о подпроцессах, но я все еще в замешательстве (я добавил фрагменты информации из того, что нашел в Интернете, чтобы прокомментировать код как можно лучше).

Вот несколько вопросов, которые у меня есть относительно приведенного ниже кода:

когда используется подпроцесс? когда я должен использовать стихи Popen, более удобные ручки с подпроцессом? что делает ПАЙП? что делает close_fds?

в основном мне нужно объяснить эту строку кода

my_process=Popen(['player',my_video_File_path], stdin=PIPE, close_fds=True)

полный код здесь:

#run UNIX commands we need to create a subprocess
from subprocess import Popen, PIPE
import os
import time
import RPi.GPIO as GPIO
my_video_file_path='/home/pi/green1.mp4'
#stdin listens for information
# PIPE connnects the stdin with stdout
#pipe, (like a pipe sending info through a tunnel from one place to another )
#STDIN (channel 0):
#Where your command draws the input from. If you don’t specify anything special this will be your keyboard input.
#STDOUT (channel 1):
#Where your command’s output is sent to. If you don’t specify anything special the output is displayed in your shell.
#to send data to the process’s stdin, you need to create the Popen object with stdin=PIPE.
#Popen interface can be used directly with subprocess

# with pipe The return value is an open file object connected to the pipe, which can be read or written depending on whether mode is 'r' (default) or 'w'.
#If we pass everything as a string, then our command is passed to the shell;
#"On Unix, if args is a string, the string is interpreted as the name or path of the program to execute. "
my_process=Popen(['player',my_video_File_path], stdin=PIPE, close_fds=True)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(22,GPIO.IN,pull_up_down=GPIO.PUD_UP)


while True:
    button_state=GPIO.input(17)
    button_state1=GPIO.input(22)

    if button_state==False:
        print("quite video")
        my_process.stdin.write("q")
        time.sleep(.09)

    if button_state1==False:
        print("full video")
        my_process.stdin.write("fs")
        time.sleep(5)

person Bob    schedule 15.01.2018    source источник


Ответы (1)


Что касается разницы между подпроцессом и Popen, вот строка из документов Python 3.5:

Для более продвинутых вариантов использования можно напрямую использовать базовый интерфейс Popen. (по сравнению с использованием подпроцесса)

Итак, это означает, что подпроцесс является оболочкой для Popen.

PIPE используется для того, чтобы ваш скрипт Python взаимодействовал с подпроцессом через стандартные операции ввода-вывода (вы можете думать о печати в Python как о типе стандартного вывода).

Итак, когда вы делаете my_process.stdin.write("fs"), вы отправляете этот текст (или передаете его по конвейеру) на стандартный ввод вашего подпроцесса. Затем ваш подпроцесс читает этот текст и выполняет необходимую обработку.

Чтобы лучше понять подобработку, попробуйте прочитать стандартный ввод в программе Python, чтобы увидеть, как она работает. Вы можете следить за этим Как вы читаете со стандартного ввода в Python? Вопрос к работе над этим упражнением.

Кроме того, возможно, стоит узнать о конвейерах в более общем стиле Linux. Попробуйте прочитать эту статью.

person Jeff Mandell    schedule 01.02.2018