Avisos ao abrir programas por meio de chamadas de subprocesso do Python

1

Eu estou tentando abrir uma imagem e um arquivo de texto que meu programa Python (3.3.2) está criando (os arquivos são criados sem problemas). As duas últimas linhas do programa são:

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

O arquivo de texto é aberto com sucesso, com os seguintes avisos retornados ao terminal:

(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

O arquivo de imagem não abre até eu fechar a janela do arquivo de texto e, em seguida, retorna os seguintes avisos semelhantes ao terminal:

(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

Através da leitura de outros tópicos online, descobri que os avisos não são um problema para mim (apenas algo que provavelmente existe como resultado da última dist, mas os avisos realmente não me incomodam).

Meu problema é que os avisos (aparentemente) estão impedindo que o script continue e também abra o visualizador de imagens e, secundariamente, atravancará o terminal de uma maneira que parece pouco profissional. Obrigado por qualquer ajuda que você possa oferecer ao suprimir esses avisos e fazer com que tanto a janela do editor de texto quanto a janela do visualizador de imagens sejam abertas simultaneamente e sem uma confusão de avisos no meu terminal.

    
por Nathan 28.07.2015 / 18:55

1 resposta

1

Seu método atual significa que duas coisas estão acontecendo:

  • Você está vendo a saída do subprocesso

    processos podem ter alguns resultados, aqui estão dois que podem ocorrer:

    • STDOUT - informações do programa que está sendo executado
    • STDERR - informações sobre erros de avisos que o programa encontrou. Este é provavelmente aquele que está te incomodando.

    O uso de opções no subprocess deve significar que você pode canalizar as saídas para /dev/null (ou seja, o não aparecerá na saída):

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

    Esta é a versão para o python 2.4+, o bit que define DEVNULL pode não ser necessário em 3.3 +

    Note que mesmo se você remover esconder toda a saída, ele ainda aguardará o processo, então ....

  • e aguarda que os processos terminem antes de continuar

    Se você quiser que o processo continue em segundo plano, use:

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

    Popen não espera a saída do processo, por isso continuará em segundo plano (ao contrário de call ) - para obter mais informações, consulte aqui .

Colocar essas 'correções' juntas deve dar a você:

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

Para o python 2.4+ novamente

Você pode obter mais informações na documentação aqui .

Eu sou um amador em python cuja versão de leafpad não dá erros, então se alguma coisa não funcionar por favor diga:)

    
por 28.07.2015 / 21:45

Tags