8

Pythonアプリケーションでプログラムを実行したいのですが、バックグラウンドで実行されますが、最終的にはフォアグラウンドになります。

GUIはそれと対話するために使用されます。ただし、コントロールはstdinおよびstdoutのコンソールを介して提供されます。アプリケーションのGUIを使用して制御できるようにしたいので、最初のアイデアは次のとおりです。

  • フォーク
  • 親では、それらにアクセスするためにdup2stdinとstdout
  • 子を実行する

これはPythonで簡単に実装できますか?私が望むことを達成するための代替方法はありますか、それは何でしょうか?

4

3 に答える 3

6

まず、python subprocess モジュールが正解です。

サブプロセスの例として:

import subprocess
x = subprocess.check_output(["echo","one","two","three"])

x は出力になります (python3 バイト クラス:x.decode('utf-8')文字列の場合)

これは stderr を複製しないことに注意してください。stderr も必要な場合は、次のようにすることができます。

x = subprocess.check_output(["bash","-c", 'echo foo; echo bar >&2'],stderr=subprocess.STDOUT)

もちろん、別の出力変数など、stderr をキャプチャする方法は他にもたくさんあります。

直接制御の使用

ただし、何かトリッキーなことをしていて、直接制御する必要がある場合は、以下のコードを調べてください。

import os
rside, wside = os.pipe()
if not os.fork():
    # Child

    os.close(rside)
    # Make stdout go to parent
    os.dup2(wside, 1)
    # Make stderr go to parent
    os.dup2(wside, 2)
    # Optionally make stdin come from nowhere
    devnull = os.open("/dev/null", os.O_RDONLY)
    os.dup2(devnull, 0)
    # Execute the desired program
    os.execve("/bin/bash",["/bin/bash","-c","echo stdout; echo stderr >&2"],os.environ)
    print("Failed to exec program!")
    sys.exit(1)

# Parent
os.close(wside)
pyrside = os.fdopen(rside)

for line in pyrside:
   print("Child (stdout or stderr) said: <%s>"%line)

# Prevent zombies!  Reap the child after exit
pid, status = os.waitpid(-1, 0)
print("Child exited: pid %d returned %d"%(pid,status))

注: @Beginnerの回答にはいくつかの点で欠陥があります: os._exit(0) が含まれていたため、すぐに子が終了し、他のすべてが無意味になりました。質問の主な目標を無意味にする os.execve() はありません。別の質問の目標として、子の stdout/stderr にアクセスする方法はありません。

于 2019-03-25T21:48:37.773 に答える
5

これは、標準の Python サブプロセス モジュールを使用するとかなり簡単です。

http://docs.python.org/py3k/library/subprocess.html

于 2012-02-09T13:03:27.333 に答える
3

これは、構築する構造がそれほど複雑ではありません。

この例を確認してください

if os.fork():
    os._exit(0)
    os.setsid()
    os.chdir("/")
    fd = os.open("/dev/null", os.O_RDWR)
    os.dup2(fd, 0)
    os.dup2(fd, 1)
    os.dup2(fd, 2)
if fd 2:
    os.close(fd)

このPythonコードは、IDを設定し、ディレクトリを変更し、ファイルを開いて処理し、閉じます。

于 2012-02-09T12:59:43.673 に答える