2

私はPythonでアプリケーションプラグインを構築しています。これにより、ユーザーは単純なスクリプト(Mac OS Xで動作)を使用してアプリケーションを任意に拡張できます。Pythonスクリプトの実行は簡単ですが、Rubyなどの言語に慣れているユーザーもいます。

私が読んだことからsubprocess、パイプを使用してRubyスクリプト(または他の任意のシェルスクリプト)を簡単に実行し、それらの出力をキャプチャすることができます。それは問題ではなく、オンラインにはたくさんの例があります。ただし、スクリプトに複数の変数を提供する必要があり(たとえば、テキストのチャンクと、スクリプトが変更するテキストに関するいくつかの単純なブール情報)、これを行うための最良の方法を見つけるのに苦労しています。

誰かがこれを達成するための最良の方法についての提案がありますか?私の目標は、スクリプト内でその情報にアクセスするために必要な最小限のコードで、必要な情報をスクリプトに提供することです。

前もって感謝します!

4

3 に答える 3

4

http://docs.python.org/library/subprocess.html#using-the-subprocess-moduleを参照してください

args は文字列、または一連のプログラム引数でなければなりません。実行するプログラムは通常、args シーケンスの最初の項目、または文字列が指定されている場合は文字列ですが、executable 引数を使用して明示的に設定できます。

したがって、呼び出しは次のようになります

p = subprocess.Popen( args=["script.sh", "-p", p_opt, "-v", v_opt, arg1, arg2] )

の引数に任意の Python 値を入れましたsubprocess.Popen

于 2009-04-03T15:16:32.587 に答える
1

複数のスクリプトを起動し、それぞれに同じ情報を渡す必要がある場合は、環境を使用することを検討してください (警告、私は Python を知らないので、次のコードはおそらく最悪です)。

#!/usr/bin/python 

import os

try:
    #if environment is set
    if os.environ["child"] == "1":
        print os.environ["string"]
except:
    #set environment
    os.environ["child"]  = "1"
    os.environ["string"] = "hello world"

    #run this program 5 times as a child process
    for n in range(1, 5):
        os.system(__file__)
于 2009-04-03T15:37:09.433 に答える
0

1 つの方法として、親スクリプトと子スクリプトの間のプロトコルとして json を使用することが考えられます。これは、json のサポートが多くの言語で容易に利用でき、表現力がかなり高いためです。パイプを使用して、任意の量のデータを子プロセスに送信することもできます。これは、要件によって、子スクリプトが標準入力から読み取れるようにすることを前提としています。たとえば、親は次のようなことを行うことができます (Python 2.6 を表示):

#!/usr/bin/env python

import json
import subprocess

data_for_child = {
    'text' : 'Twas brillig...',
    'flag1' : False,
    'flag2' : True
}

child = subprocess.Popen(["./childscript"], stdin=subprocess.PIPE)
json.dump(data_for_child, child.stdin)

そして、ここに子スクリプトのスケッチがあります:

#!/usr/bin/env python
# Imagine this were written in a different language.

import json
import sys

d = json.load(sys.stdin)
print d

この簡単な例では、出力は次のようになります。

$ ./foo12.py
{u'text': u'Twas brillig...', u'flag2': True, u'flag1': False}
于 2009-04-05T07:48:15.237 に答える