Pythonサブプロセス呼び出しでプログラムを開くときの警告

Pythonサブプロセス呼び出しでプログラムを開くときの警告

Python(3.3.2)プログラムで生成された画像とテキストファイルを開こうとします(ファイルは問題なく生成されます)。プログラムの最後の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によって警告がある可能性が高く、警告が実際に私を悩ませません)。

私の問題は、主に警告(表示)によってスクリプトが実行されず、画像ビューアが開き、2番目にやや非専門的に見えるように端末が複雑になることです。これらの警告を抑制し、端末に複数の警告なしにテキストエディタウィンドウと画像ビューアウィンドウを同時に開くのを助けてくれてありがとう。

ベストアンサー1

現在のアプローチは、2つのことが起こっていることを意味します。

  • 子プロセスの出力が表示されます。

    プロセスにはいくつかの出力があり、次の2つの結果が発生する可能性があります。

    • 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エラーは発生しません。したがって、何かがうまくいかない場合は教えてください :)

おすすめ記事