복붙노트

[PYTHON] 'stdin'을 파이썬의 다른 프로세스에 인수로 전달하는 방법이 있습니까?

PYTHON

'stdin'을 파이썬의 다른 프로세스에 인수로 전달하는 방법이 있습니까?

파이썬으로 다중 프로세싱 모듈을 사용하는 스크립트를 만들려고합니다. 스크립트 (myscript.py라고 부름)는 파이프가있는 다른 스크립트로부터 입력을받습니다.

이런 스크립트를 호출한다고 가정 해보십시오.

$ python writer.py | python myscript.py 

여기 코드가 있습니다.

// writer.py
import time, sys

def main():
    while True:
        print "test"
        sys.stdout.flush()
        time.sleep(1)

main()

//myscript.py
def get_input():
    while True:
        text = sys.stdin.readline()
        print "hello " + text
        time.sleep(3)

if __name__ == '__main__':        
    p1 = Process(target=get_input, args=())
    p1.start()

sys.stdin 개체가 주 프로세스와 p1에서 서로 다르므로이 작업이 명확하게 작동하지 않습니다. 그래서 이것을 해결하려고 노력했습니다.

//myscript.py
def get_input(temp):
    while True:
        text = temp.readline()
        print "hello " + text
        time.sleep(3)

if __name__ == '__main__':        
    p1 = Process(target=get_input, args=(sys.stdin,))
    p1.start()

그러나 나는이 오류와 마주하여왔다.

Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "in.py", line 12, in get_input
    text = temp.readline()
ValueError: I/O operation on closed file

그래서, 나는 메인의 stdin 파일이 닫혔다 고 나는 그것을 읽을 수 없다고 생각한다. 이와 관련하여 main의 stdin 파일을 다른 프로세스로 어떻게 전달할 수 있습니까? stdin이 가능하지 않다면 다른 프로세스의 main의 stdin을 어떻게 사용할 수 있습니까?

최신 정보: 사람들이 멀티 프로세싱을 사용하는 것이 실제로 필요하지 않다고 생각하기 때문에 내 질문을 명확히 할 필요가 있습니다. myscript.py를 다음과 같이 고려하십시오.

//myscript.py
def get_input():
    while True:
        text = sys.stdin.readline()
        print "hello " + text
        time.sleep(3)

def do_more_things():
    while True:
        #// some code here
        time.sleep(60*5)

if __name__ == '__main__':        
    p1 = Process(target=get_input, args=())
    p1.start()

    do_more_things()

그래서, 나는 주 함수 (또는 다른 하위 프로세스)와 병렬로 get_input () 함수를 실행해야한다. 갈등을 가져 미안하다. 나는 괜찮은 영어를 가지고있다. 나는이 질문에 대해 명확하지 않다. 여러분이 다른 프로세스에서 기본 프로세스 STDIN 개체를 사용할 수 있는지 알려 주시면 감사하겠습니다.

미리 감사드립니다.

해결법

  1. ==============================

    1.가장 간단한 방법은 get_input () 및 do_more_things ()을 바꿔 부모 프로세스에서 sys.stdin을 읽는 것입니다.

    가장 간단한 방법은 get_input () 및 do_more_things ()을 바꿔 부모 프로세스에서 sys.stdin을 읽는 것입니다.

    def get_input(stdin):
        for line in iter(stdin.readline, ''):
            print("hello", line, end='')
        stdin.close()
    
    if __name__ == '__main__':
        p1 = mp.Process(target=do_more_things)
        p1.start()
        get_input(sys.stdin)
    

    다음으로 get_input ()에 대해 Process () 대신 Thread ()를 사용하는 것이 가장 좋습니다.

    if __name__ == '__main__':
        t = Thread(target=get_input, args=(sys.stdin,))
        t.start()
        do_more_things()
    

    위의 내용이 도움이되지 않으면 os.dup ()를 시도해보십시오 :

    newstdin = os.fdopen(os.dup(sys.stdin.fileno()))
    try: 
       p = Process(target=get_input, args=(newstdin,))
       p.start()    
    finally:
       newstdin.close() # close in the parent
    do_more_things()
    
  2. ==============================

    2.멀티 프로세싱 모듈로 생성 된 각각의 새로운 프로세스는 고유 한 PID를 가지므로 동일한 터미널에 쓰기가 있어도 표준 입력 장치와 출력 장치입니다. 따라서 잠금이 필요합니다.

    멀티 프로세싱 모듈로 생성 된 각각의 새로운 프로세스는 고유 한 PID를 가지므로 동일한 터미널에 쓰기가 있어도 표준 입력 장치와 출력 장치입니다. 따라서 잠금이 필요합니다.

    이미 두 개의 스크립트로 컨텐츠를 분리하고 get_input ()으로 세 번째 프로세스를 작성하여 두 개의 프로세스를 작성 중입니다. get_input은 프로세스가 아니라 스레드 인 경우 표준 입력을 읽을 수 있습니다. 그런 다음 판독기에 절전 기능을 사용할 필요가 없습니다.

    ## reader.py
    from threading import Thread
    import sys
    
    def get_input():
        text = sys.stdin.readline()
        while len(text) != 0:
            print 'hello ' + text
            text = sys.stdin.readline()
    
    if __name__ == '__main__':
        thread = Thread(target=get_input)
        thread.start()
        thread.join()
    
  3. ==============================

    3.이것은 부분적인 대답 일뿐입니다. 질문의 다음 부분에 대해서는 분명하지 않기 때문입니다.

    이것은 부분적인 대답 일뿐입니다. 질문의 다음 부분에 대해서는 분명하지 않기 때문입니다.

    먼저 스크립트를 호출 할 것이라고 말하면서 시작합니다.

    $ python writer.py | python myscript.py 
    

    만약 당신이 그렇게하려고한다면, 작가는 표준 출력에 쓸 필요가 있고 myscript는 표준 입력에서 읽어야합니다. 두 번째 스크립트는 다음과 같습니다.

    def get_input():
        while True:
            text = sys.stdin.readline()
            print "hello " + text
            time.sleep(3)
    if __name__ == '__main__':    
        get_input()
    

    프로세스 객체는 ... 이미 명령 행에서 두 개의 프로세스를 해고하고 있습니다. 쉘을 사용하여 연결하는 (익명) 파이프 ( "|"문자)와 연결합니다 첫 번째 스크립트의 표준 출력을 두 번째 스크립트의 표준 입력으로 변환합니다.

    Process 객체의 핵심은 첫 번째 프로세스부터 두 번째 프로세스의 시작을 관리하는 것입니다. 프로세스를 정의해야합니다. 그리고 나서 시작하십시오 - 그러면 첫 번째 프로세스를 종료하기 전에 종료 될 때까지 기다리고 싶을 것입니다 ... (p1.join ()을 호출 한 후 p1.start ()를 호출하면 충분합니다).

    파이썬 제어하에 한 쌍의 프로세스 사이에서 통신하려면 multiprocess.Pipe 객체를 사용하는 것이 좋습니다. 그런 다음 표준 입력 및 표준 출력 대신 Pipe 객체에서 읽고 쓰는 방법으로 초기 생성 된 하위 프로세스와 하위 생성 된 프로세스간에 쉽게 통신 할 수 있습니다. 표준 입력과 표준 출력을 정말로 재배치하고 싶다면 저수준 파일 기술자를 사용하거나 sys.stdin 및 sys.stdout 객체를 대체 / 대체하여 가능할 수 있습니다 ...하지만 의심 스럽습니다. , 당신은 아마 이것을 원하거나 원하지 않을 것이다.

  4. ==============================

    4.파이프 인 입력을 읽으려면 fileinput을 사용하십시오.

    파이프 인 입력을 읽으려면 fileinput을 사용하십시오.

    myscript.py

    import fileinput
    
    if __name__ == '__main__':
        for line in fileinput.input():
            #do stuff here
            process_line(line)
    
  5. from https://stackoverflow.com/questions/8976962/is-there-any-way-to-pass-stdin-as-an-argument-to-another-process-in-python by cc-by-sa and MIT license