파이썬에서 외부 exe 프로그램을 독립적으로 실행하는 방법
글쓴이: secretdog1 / 작성시간: 화, 2018/06/19 - 11:34오전
파이썬으로 외부 exe 프로그램을 실행하려고 합니다.
subprocess.call(), subprocess.Popen(), os.system()을 써 보았는데 전부 외부 프로그램을 모니터링하면서 외부 프로그램에서 뭔가를 하면 메인 프로세스가 대기상태로 바뀌더라구요.
외부 프로그램에서 알림창을 띄우면 메인 프로세스는 무한정 대기 상태가 됩니다.
외부 프로그램을 그냥 실행만 하고 메인 프로세스와는 독립적인 상태로 두고 싶은데, 방법이 없을까요?
윈도우 환경입니다.
Forums:
참고해보세요
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=960913&ref=960913&page=1
http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=169119&ref=169119&page=1
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=960918&ref=960918&page=1
★CreateProcess() ★Launcher class ★start.exe ★System.Diagnostics.Process ★ShellExecute() ★CreateProcess2 ★system 프로세스 실행 방법
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
파이썬이 아니네요.
답변을 잘못 달아주신 것 같습니다.
제가 사용하는 언어는 파이썬 입니다.
https://stackoverflow.com
https://stackoverflow.com/questions/636561/how-can-i-run-an-external-command-asynchronously-from-python
python asynchronous execution external command 으로 검색하면 가장 처음 나오는 결과입니다. 채택된 답변이 원하시는 바를 정확히 알려주네요. 그 답변에 달린 코멘트들도 잘 읽으세요. 그리고 "asynchronous" 라는 단어를 기억해두세요. 이 참에 asynchronous execution (call, run, ...) 과 synchronous execution 의 차이를 찾아서 공부해두시면 좋을겁니다. 우리말로는 보통 비동기 / 동기로 번역합니다. unblocking call / blocking call 도 같은 뜻 입니다.
답변 감사드립니다.
문제점을 찾다보니 외부 프로그램의 알림창이 우선순위가 높아 확인 버튼을 누르기 전에는 메인 프로그램을 대기상태로 빠뜨리고 있었던 것 같습니다.
혹시 이런 것도 답변해주신 걸로 해결이 가능한가요?
Popen, 동기/비동기는 원래 알고 있던 방법들인데 해당 방법들로 시도해도 이런 상황이 발생되어서요.
답변 감사합니다.
알림창을 띄우기 위해 자식 프로세스가 부모 프로세스를
알림창을 띄우기 위해 자식 프로세스가 부모 프로세스를 블럭할 이유는 없습니다. 즉, 특별한 상황이 아니라면 원래 아무 문제가 없어야합니다. 문제를 재현하는 짧은 코드를 보여주실 수 있으신지요?
외부 프로그램은 제가 작성한 프로그램이 아니기 때문에
외부 프로그램은 제가 작성한 프로그램이 아니기 때문에 코드가 없습니다.
일단 해당 프로그램은 다음과 같은 코드로 실행시키고 있습니다.
subprocess.Popen('.\folder\program.exe')
이 한 줄이 다입니다. 그리고 이 코드가 실행되는 방식은 다음과 같습니다.
tkinter GUI 실행코드(gui.py)의 UI 생성 클래스(tk.Frame을 상속받은 클래스.)에서 외부 프로그램 실행 모듈(external.py) 호출.
import external
external.EXT()
external.py에 선언된 EXT 클래스를 생성하는 순간 subprocess 코드가 실행이 됩니다.
왠지 win32api 때문인지도 모르겠네요.
왠지 win32api 때문인지도 모르겠네요.
subprocess로 프로그램을 호출하지 않고 개별적으로 실행시켜도 대기상태가 됩니다.
버튼을 누르면 sin32api.SendMessage() 로 외부 프로그램에 메시지를 보내면 외부 프로그램에서 알림창을 띄우는데, 여기서 문제가 생겼을 가능성이 큰 것 같습니다.
win32api.SendMessage 는
win32api.SendMessage 는 blocking method 입니다. win32api.PostMessage를 한번 시도해보세요.
그 문제가 맞았습니다. 답변 감사드립니다.
그 문제가 맞았습니다.
답변 감사드립니다.
해결했습니다.
해결했습니다.
문제는 win32api의 SendMessage() 메소드에 있었습니다.
SendMessage()는 block을 하는 메소드더라구요.
PostMessage()로 바꾸니 blocking을 하지 않네요.
도움 감사드립니다.
댓글 달기