28

Python経由でディレクトリからスクリプトを呼び出したい(実行可能なシェルスクリプトです)。

ここまでは順調ですね:

    for script in sorted(os.listdir(initdir), reverse=reverse):
        if script.endswith('.*~') or script == 'README':
             continue
        if os.access(script, os.X_OK):
            try:
                execute = os.path.abspath(script)
                sp.Popen((execute, 'stop' if reverse else 'start'),
                         stdin=None, stderr=sp.PIPE,
                         stdout=sp.stderr, shell=True).communicate()
            except:
                raise

今私が欲しいのは、開始機能を備えたbashスクリプトがあるとしましょう。私が呼ぶところから

エコー「何か」

ここで、sys.stdout と終了コードでそのエコーを確認したいと思います。私はあなたが .communicate() でこれを行うと信じていますが、私のものは私が思っていたようには機能しません。

私は何を間違っていますか?

どんな助けでも大歓迎です

4

1 に答える 1

70

http://docs.python.org/library/subprocess.htmlを授与します

communicate() はタプル (stdoutdata, stderrdata) を返します。

サブプロセスが終了したら、Popen インスタンスからリターン コードを取得できます。

Popen.returncode: poll() と wait() によって (また、communicate() によって間接的に) 設定される、子の戻りコード。

同様に、次のように目標を達成できます。

sp = subprocess.Popen([executable, arg1, arg2], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = sp.communicate()
if out:
    print "standard output of subprocess:"
    print out
if err:
    print "standard error of subprocess:"
    print err
print "returncode of subprocess:"
print sp.returncode

ところで、私はテストを変更します

    if script.endswith('.*~') or script == 'README':
         continue

ポジティブなものに:

if not filename.endswith(".sh"):
    continue

実行したくないことを明示するよりも、実行したいことを明示する方がよいでしょう。

また、より一般的な方法で変数に名前を付ける必要があるため、最初に指定するscript必要があります。filenameディレクトリもリストするのでlistdir、それらを明示的に確認できます。try/except特定の例外を処理しない限り、現在のブロックは適切ではありません。の代わりに、とabspathを連結する必要があります。これは、 のコンテキストでよく適用される概念です。セキュリティ上の理由から、オブジェクトのコンストラクターで使用する必要があることが確実な場合にのみ使用してください。次のことを提案させてください。initdirfilenameos.listdir()shell=TruePopen

for filename in sorted(os.listdir(initdir), reverse=reverse):
    if os.path.isdir(filename) or not filename.endswith(".sh"):
         continue
    if os.access(script, os.X_OK):
        exepath = os.path.join(initdir, filename)
        sp = subprocess.Popen(
            (exepath, 'stop' if reverse else 'start'),
            stderr=subprocess.PIPE,
            stdout=subprocess.PIPE)
        out, err = sp.communicate()
        print out, err, sp.returncode
于 2012-05-21T10:12:01.290 に答える