Python 하위 프로세스 호출을 통해 프로그램을 열 때 경고

Python 하위 프로세스 호출을 통해 프로그램을 열 때 경고

Python(3.3.2) 프로그램에서 생성하는 이미지 및 텍스트 파일을 열려고 합니다(파일은 문제 없이 생성됩니다). 프로그램의 마지막 두 줄은 다음과 같습니다.

subprocess.call(['leafpad', filename + '.tsv'])
subprocess.call(['gpicview',filename + '_fig.png'])

텍스트 파일이 성공적으로 열리고 터미널은 다음 경고를 반환합니다.

(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-menu-bar-popup-delay after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-label-select-on-focus after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-can-change-accels after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-menu-popup-delay after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-menu-popdown-delay after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-menu-images after class was initialised
(leafpad:3676): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-scrolled-window-placement after class was initialised

텍스트 파일 창을 닫을 때까지 이미지 파일이 열리지 않으며 터미널에 비슷한 경고가 반환됩니다.

(gpicview:3682): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-scrolled-window-placement after class was initialised
(gpicview:3682): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-button-images after class was initialised
(gpicview:3682): GLib-GObject-WARNING **: Attempt to add property GtkSettings::gtk-label-select-on-focus after class was initialised

온라인에서 다른 스레드를 읽은 결과 경고가 나에게 문제가 되지 않는다는 것을 알았습니다(단지 최신 dist로 인해 경고가 있을 가능성이 높으며 경고가 실제로 나를 괴롭히지 않습니다).

내 문제는 주로 경고(표시됨)로 인해 스크립트가 계속 실행되지 않고 이미지 뷰어가 열리며 두 번째로 다소 비전문적으로 보이는 방식으로 터미널이 복잡해진다는 것입니다. 이러한 경고를 억제하고 터미널에 여러 가지 경고 없이 텍스트 편집기 창과 이미지 뷰어 창이 동시에 열리도록 도와주셔서 감사합니다.

답변1

현재 접근 방식은 두 가지 일이 일어나고 있음을 의미합니다.

  • 하위 프로세스의 출력이 표시됩니다.

    프로세스에는 몇 가지 출력이 있을 수 있으며, 다음과 같은 두 가지 결과가 발생할 수 있습니다.

    • STDOUT- 실행중인 프로그램의 정보
    • STDERR- 프로그램에서 발생한 경고 오류에 대한 정보입니다. 이것이 당신을 짜증나게 하는 것일 수도 있습니다.

    on 옵션을 사용하면 subprocess출력을 다음으로 파이프할 수 있음을 의미합니다 /dev/null(즉, 출력에 표시되지 않음).

    DEVNULL = open(os.devnull, 'wb')
    subprocess.call(['leafpad', filename + '.tsv'], stdout=DEVNULL, stderr=DEVNULL)
    

    이는 Python 2.4+용이며 DEVNULL3.3+에서는 비트 정의가 필요하지 않을 수 있습니다.

    모든 출력 숨기기를 제거하더라도 여전히 프로세스를 기다리게 되므로...

  • 계속하기 전에 프로세스가 완료될 때까지 기다립니다.

    프로세스를 백그라운드에서 계속하려면 다음 명령을 사용할 수 있습니다.

    subprocess.Popen(['leafpad', filename + '.tsv'])
    

    Popen프로세스가 종료될 때까지 기다리지 않으므로 백그라운드에서 계속 진행됩니다( call). 자세한 내용은 을 참조하세요.여기.

이러한 "수정 사항"을 함께 적용하면 다음이 제공됩니다.

DEVNULL = open(os.devnull, 'wb')
subprocess.Popen(['leafpad', filename + '.tsv'], stdout=DEVNULL, stderr=DEVNULL)

다시 Python 2.4 이상에서 작동합니다.

문서에서 더 많은 정보를 얻을 수 있습니다.여기.

저는 Python 아마추어이고 제 버전에서는 leafpad오류가 발생하지 않습니다. 따라서 뭔가가 작동하지 않으면 말씀해 주세요 :)

관련 정보