2009-04-03 9 views
2

私はPythonでアプリケーションプラグインを構築しています。これにより、ユーザーは任意のアプリケーションを単純なスクリプト(Mac OS Xで動作)で拡張することができます。 Pythonスクリプトを実行するのは簡単ですが、Rubyのような言語を使用する方が快適です。任意のシェルスクリプトを実行し、Python経由で複数の変数を渡す方法は?

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

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

ありがとうございます!

答えて

4

http://docs.python.org/library/subprocess.html#using-the-subprocess-module

引数が文字列、またはプログラム引数の順序 する必要があります参照してください。 のプログラムは、 の最初の項目であり、 文字列が指定されている場合はargsシーケンスまたは文字列ですが、実行可能な引数を使用して明示的に に設定することができます。

だから、あなたの呼び出しは、あなたがsubprocess.Popenの引数に任意のPythonの値を入れている。この

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

のように見えることができます。

+0

私は自分自身を見つけましたが、それはスクリプトにとって非常にやさしいとは言えません。なぜなら、データが必要な場合はコマンドライン引数を解析する必要があるからです。より良いオプションがない場合は、私はこれで行くでしょう。ありがとう! –

+0

何ですか?これは何を意味するのでしょうか? "それは[スクリプト]がコマンドライン引数を解析しなければならないからです"スクリプトがするのはそうです。あなたの懸念事項や問題点を説明するために質問を更新してください。 –

+0

PythonコードからPython以外のスクリプトでコード量が最も少ない非Pythonスクリプトに変数を取得する方法を見つける必要があります。スクリプトは他の人が作成し、必要な要件が少ないほど、それらを書く可能性が高くなります。 –

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__) 
0

一つのアプローチは、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} 
関連する問題