복붙노트

[PYTHON] python3에서 프로그램의 표준 입력으로 보내기 3

PYTHON

python3에서 프로그램의 표준 입력으로 보내기 3

나는 main.py와 child.py 파일을 가지고있다.

main.py의 stdin에 문자열을 보내려고합니다.

이것은 내 불완전한 코드입니다.

from subprocess import *
import time

def main():
    program = Popen(['python.exe'. 'child.py', 'start'])
    while True: #waiting for'1' to be sent to the stdin
        if sys.stdin == '1':
            print('text)

if __name__ == '__main__':
    main()
import sys

if sys.argv[1] == 'start':
    inp = input('Do you want to send the argument?\n').lower()
    if inp == 'no':
        sys.exit()
    elif inp == 'yes':
        #Somehow send '1' to the stdin of 1.py while it is running

나는 이것을 어떻게하는지 모른다.

파이썬 3.5.1 윈도우 10을 실행하고 있습니다.

-감사

편집하다: 논쟁을 main.py에 보내면 프로그램을 다시 열 수 없습니다. os.system은 필자의 경우 유용하지 않은 프로그램을 다시 엽니 다.

이 프로그램은 내가하려는 일의 작은 데모입니다. 제 실제 프로그램에서는 두 프로그램이 항상 서로 의사 소통을해야하므로 필요 없습니다.

내가 대답해야 할 것은 아마도 stdin을 사용하여 main.py에 인수를 보내는 방법이지만, 인수를 보낼 때 프로그램을 다시 열 수는 없습니다. os.system과 같은 몇 가지 예는 내가하려는 일이 아닌 프로그램을 다시 엽니 다. 항상 main.py를 열어야합니다.

내 새로운 코드가 작동하지 않습니다. 창이 열리고 닫힙니다.

from subprocess import Popen, PIPE, STDOUT
x = Popen(['python.exe', '2.py', 'start'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
while x.poll() is None:
    if b'Do you want to send the argument?' in x.stdout.read():
        x.stdin.write(b'yes\n')
import sys
import time
time.sleep(1)
if 1 = 1:
    inp = input('Do you want to send the argument?\n').lower()
    if inp == 'no':
        sys.exit()
    elif inp == 'yes':
        sys.stdout.write('1')
        sys.stdout.flush()

그것은 내 코드입니다.

해결법

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

    1.필요한 것은 main.py의 줄에있는 것입니다 :

    필요한 것은 main.py의 줄에있는 것입니다 :

    from subprocess import Popen, PIPE, STDOUT
    x = Popen(['some_child.exe', 'parameter'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
    
    while x.poll() is None:
        child_output = x.stdout.readline()
        print(child_output)
        if b'Do you want to send the argument?' in child_output:
            x.stdin.write(b'yes\n')
            x.stdin.flush()
    x.stdout.close()
    x.stdin.close()
    

    sys.exe / stdout을 통해 child.exe (mockup 데모, python.exe)가 main.py와 통신하고 있다고 가정하고 있지만, 이러한 I / O는 프로세스를 생성 한 쉘과 통신하는 데 사용됩니다.

    childs stdout / stdin과 비슷하게이 프로세스를 생성 한 쉘 (이 경우 Popen ())과 통신합니다.

    subprocess.Popen (...)의 자식 프로세스는 stdout / stdin / stderr로 분리됩니다. 그렇지 않으면 모든 하위 프로세스가 기본 프로세스 stdout / stdin을 엉망으로 만듭니다. 즉, 위의 예제에서와 같이 특정 하위 프로세스의 출력을 확인하고 그에 따라 작성해야합니다.

    그것을 보는 한 가지 방법은 다음과 같습니다.

    main.py를 시작하고 sys.stdout 및 sys.stdin을 통해 통신합니다. main.py의 각 input ()은 sys.stdout에 내용을 출력하므로 읽을 수 있습니다.

    모든 input ()이 뭔가를 sys.stdout에 출력하는 child.exe에는 똑같은 논리가 적용됩니다. (하지만 sys는 프로세스에서 공유 변수가 아닙니다).

    import sys
    
    if sys.argv[1] == 'start':
        inp = input('Do you want to send the argument?\n').lower()
        if inp == 'no':
            sys.exit()
        elif inp == 'yes':
            #Somehow send '1' to the stdin of 1.py while it is running
            sys.stdout.write('1')
            sys.stdout.flush()
    

    그러나 간단한 print (1)는 기본적으로 1을 sys.stdout에 출력하기 때문에 동일하게 처리합니다.

    2018 년 편집 : 입력과 출력을 닫는 것을 잊지 마세요. 파일 시스템에 열린 파일 설명자를 남기고 자원을 소모하여 나중에 문제를 일으킬 수 있기 때문입니다.

    child.exe에 대한 코드를 제어한다고 가정하고 어떤 식 으로든 통신 파이프를 수정할 수있는 몇 가지 옵션이 있습니다.

  2. from https://stackoverflow.com/questions/37560427/sending-to-the-stdin-of-a-program-in-python3 by cc-by-sa and MIT license