찾다
백엔드 개발파이썬 튜토리얼파이프라인 파이프 대화형 작업 읽기/쓰기 통신 방법을 구현하기 위해 Python3의 하위 프로세스 사용에 대한 자세한 설명

여기에서는 Windows의 셸을 예로 사용합니다.

 subprocess  *

이해를 돕기 위해 매우 간단한 코드를 사용하여 설명합니다.

파이프라인 파이프 대화형 작업 읽기/쓰기 통신 방법을 구현하기 위해 Python3의 하위 프로세스 사용에 대한 자세한 설명

Popen을 사용하여 p를 인스턴스화하고 cmd.exe 서브루틴을 만든 다음 Stdin(표준 입력 스트림) 및 Stdout(표준 출력 스트림)을 제공하고

에서 하위 프로세스를 사용하는 것을 볼 수 있습니다. 동시에 PIPE를 매개변수로 사용하여 해당 채널이 열려 있음을 나타내는 데 사용되는 특수 값입니다. (Python3.5에서는 더 나은 작업을 위해 run() 메서드가 추가되었습니다.)

그런 다음

파이프라인 파이프 대화형 작업 읽기/쓰기 통신 방법을 구현하기 위해 Python3의 하위 프로세스 사용에 대한 자세한 설명

이 정보를 계속 진행합니다. 낯익은 것 같은데? 이것은 cmd의 표준 출력입니다!

그러면 다음과 같이 출력됩니다:

파이프라인 파이프 대화형 작업 읽기/쓰기 통신 방법을 구현하기 위해 Python3의 하위 프로세스 사용에 대한 자세한 설명

방금 작성한 "echo Hellwworldsrn" 메시지가 작성되었으며 성공한 것 같습니다!

입력 버퍼를 새로 고치려면 p.stdin.flush()를 사용하고, 적어도 Windows 시스템에서는 출력 정보에도 "rn"이 필요합니다. 그렇지 않으면 그냥 새로 고치기만 하면 됩니다. (p.stdin.flush)는 유효하지 않습니다.

우리가 정확히 무엇을 했나요?
고급 활용

이제 간단하게 읽고 쓸 수 있으니 for와 threading을 추가하면 더 맛있을 것 같아요~

#run.py  

from subprocess import * 
import threading 
import time

p =Popen('cmd.exe',shell=True,stdin=PIPE,stdout=PIPE)

def run():
    global p
    while True:
        line = p.stdout.readline() 
        if not line:  #空则跳出
            break
        print(">>>>>>",line.decode("GBK"))

    print("look up!!! EXIT ===")   #跳出


w =threading.Thread(target=run)

p.stdin.write("echo HELLW_WORLD!\r\n".encode("GBK"))
p.stdin.flush()
time.sleep(1) #延迟是因为等待一下线程就绪
p.stdin.write("exit\r\n".encode("GBK"))
p.stdin.flush()

w.start()

아주 좋아, 아주 좋아, 그렇구나 출력은 무엇입니까?

줄 바꿈이 많은 이유는 cmd에서 반환된 결과에 줄 바꿈이 있고, 그러면 인쇄 출력에 줄 바꿈이 추가되므로 두 줄이 변경되기 때문입니다. . 출력에 sys.stdout .write를 사용하여 추가 줄 바꿈이 없도록 고려할 수 있습니다 파이프라인 파이프 대화형 작업 읽기/쓰기 통신 방법을 구현하기 위해 Python3의 하위 프로세스 사용에 대한 자세한 설명

이 경우 기본 읽기 및 쓰기를 수행한 다음 캡슐화를 시작하겠습니다.

Encapsulation Pipe

더 이상 말도 안되는 소리는 그만하고, 정말 배우고 싶다면 코드로 가보세요. 코드를 주의 깊게 읽어보세요.


110행

모든 프로세스를 하나의 클래스로 구현했으며 세 가지 매개변수, 종료 피드백

기능

, 준비 피드백 기능 및 출력 피드백 기능을 정의할 수 있습니다.

# -*- coding:utf-8 -*-

import subprocess  
import sys
import threading

class LoopException(Exception):
    """循环异常自定义异常,此异常并不代表循环每一次都是非正常退出的"""
    def __init__(self,msg="LoopException"):
        self._msg=msg

    def __str__(self):
        return self._msg



class SwPipe():
    """
    与任意子进程通信管道类,可以进行管道交互通信
    """
    def __init__(self,commande,func,exitfunc,readyfunc=None,
        shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,code="GBK"):
        """
        commande 命令
        func 正确输出反馈函数
        exitfunc 异常反馈函数
        readyfunc 当管道创建完毕时调用
        """
        self._thread = threading.Thread(target=self.__run,args=(commande,shell,stdin,stdout,stderr,readyfunc))
        self._code = code
        self._func = func
        self._exitfunc = exitfunc
        self._flag = False
        self._CRFL = "\r\n"

    def __run(self,commande,shell,stdin,stdout,stderr,readyfunc):
        """ 私有函数 """
        try:
            self._process = subprocess.Popen(
                commande,
                shell=shell,
                stdin=stdin,
                stdout=stdout,
                stderr=stderr
                )  
        except OSError as e:
            self._exitfunc(e)
        fun = self._process.stdout.readline
        self._flag = True
        if readyfunc != None:
            threading.Thread(target=readyfunc).start() #准备就绪
        while True:
            line = fun()  
            if not line:  
                break
            try:
                tmp = line.decode(self._code)
            except UnicodeDecodeError:
                tmp =  \
                self._CRFL + "[PIPE_CODE_ERROR] <Code ERROR: UnicodeDecodeError>\n" 
                + "[PIPE_CODE_ERROR] Now code is: " + self._code + self._CRFL
            self._func(self,tmp)

        self._flag = False
        self._exitfunc(LoopException("While Loop break"))   #正常退出


    def write(self,msg):
        if self._flag:
            #请注意一下这里的换行
            self._process.stdin.write((msg + self._CRFL).encode(self._code)) 
            self._process.stdin.flush()
            #sys.stdin.write(msg)#怎么说呢,无法直接用代码发送指令,只能默认的stdin
        else:
            raise LoopException("Shell pipe error from &#39;_flag&#39; not True!")  #还未准备好就退出


    def start(self):
        """ 开始线程 """
        self._thread.start()

    def destroy(self):
        """ 停止并销毁自身 """
        process.stdout.close()
        self._thread.stop()
        del self
       





if __name__ == &#39;__main__&#39;:   #那么我们来开始使用它吧
    e = None

    #反馈函数
    def event(cls,line):#输出反馈函数
        sys.stdout.write(line)

    def exit(msg):#退出反馈函数
        print(msg)

    def ready():#线程就绪反馈函数
        e.write("dir")  #执行
        e.write("ping www.baidu.com")
        e.write("echo Hello!World 你好中国!你好世界!")
        e.write("exit")

    e = SwPipe("cmd.exe",event,exit,ready)
    e.start()
출력:

명령이 순차적으로 실행되는 것을 볼 수 있습니다. 물론 OS도 이에 대한 책임이 있습니다. 파이프라인 파이프 대화형 작업 읽기/쓰기 통신 방법을 구현하기 위해 Python3의 하위 프로세스 사용에 대한 자세한 설명

그럼 확장 가능한 Pipe 클래스가 만들어졌어야죠?

A: 이 코드 앞에 줄 번호를 추가하는 이유는 복사를 방지하기 위한 것입니다. 왜냐하면 여기서 무슨 일이 일어나고 있는지 전혀 이해하지 못할 수도 있지만 사용법만 알 수 있기 때문입니다.

그나저나:

이미 자세히 설명되어 있는 공식 문서를 참조하는 것이 가장 좋습니다. 원하는 작업에 따라 subprocess.Popen.communicate가 더 적합할 수 있습니다.

위 내용은 파이프라인 파이프 대화형 작업 읽기/쓰기 통신 방법을 구현하기 위해 Python3의 하위 프로세스 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
파이썬 어레이에 어떤 데이터 유형을 저장할 수 있습니까?파이썬 어레이에 어떤 데이터 유형을 저장할 수 있습니까?Apr 27, 2025 am 12:11 AM

PythonlistsCanstoreAnyDatAtype, ArrayModuLearRaysStoreOneType 및 NUMPYARRAYSAREFORNUMERICALPUTATION.1) LISTSAREVERSATILEBUTLESSMEMORY-EFFICENT.2) ARRAYMODUERRAYRAYRAYSARRYSARESARESARESARESARESARESAREDOREDORY-UNFICEDONOUNEOUSDATA.3) NumpyArraysUraysOrcepperperperperperperperperperperperperperperperferperferperferferpercient

파이썬 어레이에 잘못된 데이터 유형의 값을 저장하려고하면 어떻게됩니까?파이썬 어레이에 잘못된 데이터 유형의 값을 저장하려고하면 어떻게됩니까?Apr 27, 2025 am 12:10 AM

whenyouattempttoreavalueofthewrongdatatypeinapythonaphonarray, thisiSdueTotheArrayModule의 stricttyPeenforcement, theAllElementStobeofthesAmetypecified bythetypecode.forperformancersassion, arraysaremoreficats the thraysaremoreficats thetheperfication the thraysaremorefications는

Python Standard Library의 일부는 무엇입니까? 목록 또는 배열은 무엇입니까?Python Standard Library의 일부는 무엇입니까? 목록 또는 배열은 무엇입니까?Apr 27, 2025 am 12:03 AM

Pythonlistsarepartoftsandardlardlibrary, whileraysarenot.listsarebuilt-in, 다재다능하고, 수집 할 수있는 반면, arraysarreprovidedByTearRaymoduledlesscommonlyusedDuetolimitedFunctionality.

스크립트가 잘못된 파이썬 버전으로 실행되는지 확인해야합니까?스크립트가 잘못된 파이썬 버전으로 실행되는지 확인해야합니까?Apr 27, 2025 am 12:01 AM

thescriptIsrunningwithHongpyThonversionDueCorRectDefaultTerpretersEttings.tofixThis : 1) checktheDefaultPyThonVersionUsingPyThon-VersionorPyThon3- version.2) usvirtual-ErondmentsBythePython.9-Mvenvmyenv, 활성화, 및 파괴

파이썬 어레이에서 수행 할 수있는 일반적인 작업은 무엇입니까?파이썬 어레이에서 수행 할 수있는 일반적인 작업은 무엇입니까?Apr 26, 2025 am 12:22 AM

PythonArraysSupportVariousOperations : 1) SlicingExtractsSubsets, 2) 추가/확장 어드먼트, 3) 삽입 값 삽입 ATSpecificPositions, 4) retingdeletesElements, 5) 분류/ReversingChangesOrder 및 6) ListsompectionScreateNewListSbasedOnsistin

어떤 유형의 응용 프로그램에서 Numpy Array가 일반적으로 사용됩니까?어떤 유형의 응용 프로그램에서 Numpy Array가 일반적으로 사용됩니까?Apr 26, 2025 am 12:13 AM

NumpyArraysareSentialplosplicationSefficationSefficientNumericalcomputationsanddatamanipulation. Theyarcrucialindatascience, MachineLearning, Physics, Engineering 및 Financeduetotheiribility에 대한 handlarge-scaledataefficivally. forexample, Infinancialanyaly

파이썬의 목록 위의 배열을 언제 사용 하시겠습니까?파이썬의 목록 위의 배열을 언제 사용 하시겠습니까?Apr 26, 2025 am 12:12 AM

UseanArray.ArrayOveralistInpyThonWhendealingwithhomogeneousData, Performance-CriticalCode, OrinterFacingwithCcode.1) HomogeneousData : ArraysSaveMemorywithtypepletement.2) Performance-CriticalCode : arraysofferbetterporcomanceFornumericalOperations.3) Interf

모든 목록 작업은 배열에 의해 지원됩니까? 왜 또는 왜 그렇지 않습니까?모든 목록 작업은 배열에 의해 지원됩니까? 왜 또는 왜 그렇지 않습니까?Apr 26, 2025 am 12:05 AM

아니요, NOTALLLISTOPERATIONARESUPPORTEDBYARRARES, andVICEVERSA.1) ArraySDONOTSUPPORTDYNAMICOPERATIONSLIKEPENDORINSERTWITHUTRESIGING, WHITHIMPACTSPERFORMANCE.2) ListSDONOTEECONSTANTTIMECOMPLEXITEFORDITITICCESSLIKEARRAYSDO.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.