파이썬에서 외부 exe 프로그램을 독립적으로 실행하는 방법

secretdog1의 이미지

파이썬으로 외부 exe 프로그램을 실행하려고 합니다.

subprocess.call(), subprocess.Popen(), os.system()을 써 보았는데 전부 외부 프로그램을 모니터링하면서 외부 프로그램에서 뭔가를 하면 메인 프로세스가 대기상태로 바뀌더라구요.

외부 프로그램에서 알림창을 띄우면 메인 프로세스는 무한정 대기 상태가 됩니다.

외부 프로그램을 그냥 실행만 하고 메인 프로세스와는 독립적인 상태로 두고 싶은데, 방법이 없을까요?

윈도우 환경입니다.

shint의 이미지

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

secretdog1의 이미지

답변을 잘못 달아주신 것 같습니다.
제가 사용하는 언어는 파이썬 입니다.

익명 사용자의 이미지

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 도 같은 뜻 입니다.

secretdog1의 이미지

문제점을 찾다보니 외부 프로그램의 알림창이 우선순위가 높아 확인 버튼을 누르기 전에는 메인 프로그램을 대기상태로 빠뜨리고 있었던 것 같습니다.
혹시 이런 것도 답변해주신 걸로 해결이 가능한가요?
Popen, 동기/비동기는 원래 알고 있던 방법들인데 해당 방법들로 시도해도 이런 상황이 발생되어서요.
답변 감사합니다.

익명 사용자의 이미지

알림창을 띄우기 위해 자식 프로세스가 부모 프로세스를 블럭할 이유는 없습니다. 즉, 특별한 상황이 아니라면 원래 아무 문제가 없어야합니다. 문제를 재현하는 짧은 코드를 보여주실 수 있으신지요?

secretdog1의 이미지

외부 프로그램은 제가 작성한 프로그램이 아니기 때문에 코드가 없습니다.
일단 해당 프로그램은 다음과 같은 코드로 실행시키고 있습니다.

subprocess.Popen('.\folder\program.exe')

이 한 줄이 다입니다. 그리고 이 코드가 실행되는 방식은 다음과 같습니다.
tkinter GUI 실행코드(gui.py)의 UI 생성 클래스(tk.Frame을 상속받은 클래스.)에서 외부 프로그램 실행 모듈(external.py) 호출.

import external
external.EXT()

external.py에 선언된 EXT 클래스를 생성하는 순간 subprocess 코드가 실행이 됩니다.

secretdog1의 이미지

왠지 win32api 때문인지도 모르겠네요.
subprocess로 프로그램을 호출하지 않고 개별적으로 실행시켜도 대기상태가 됩니다.

버튼을 누르면 sin32api.SendMessage() 로 외부 프로그램에 메시지를 보내면 외부 프로그램에서 알림창을 띄우는데, 여기서 문제가 생겼을 가능성이 큰 것 같습니다.

익명 사용자의 이미지

win32api.SendMessage 는 blocking method 입니다. win32api.PostMessage를 한번 시도해보세요.

secretdog1의 이미지

그 문제가 맞았습니다.
답변 감사드립니다.

secretdog1의 이미지

해결했습니다.
문제는 win32api의 SendMessage() 메소드에 있었습니다.
SendMessage()는 block을 하는 메소드더라구요.
PostMessage()로 바꾸니 blocking을 하지 않네요.

도움 감사드립니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.