[PYTHON] python3에서 프로그램의 표준 입력으로 보내기 3
PYTHONpython3에서 프로그램의 표준 입력으로 보내기 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.필요한 것은 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에 대한 코드를 제어한다고 가정하고 어떤 식 으로든 통신 파이프를 수정할 수있는 몇 가지 옵션이 있습니다.
from https://stackoverflow.com/questions/37560427/sending-to-the-stdin-of-a-program-in-python3 by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] C #의 Python 스크립트에서 특정 메서드를 호출하려면 어떻게해야합니까? (0) | 2018.10.24 |
---|---|
[PYTHON] 트위스트 conch 파일 전송 (0) | 2018.10.24 |
[PYTHON] Scikit을 사용하여 특정 클래스 예측에 대한 각 기능의 기여도 결정 (0) | 2018.10.24 |
[PYTHON] Scrapy : spider_idle 이벤트 콜백에서 요청을 수동으로 삽입하는 방법은 무엇입니까? (0) | 2018.10.24 |
[PYTHON] 파이썬 : mechanize.Browser 인스턴스의 쿠키를 버리는 법? (0) | 2018.10.24 |