2009-04-03 3 views
2

Ich baue ein Anwendungs-Plugin in Python, mit dem Benutzer die Anwendung beliebig mit einfachen Skripten (unter Mac OS X) erweitern können. Die Ausführung von Python-Skripten ist einfach, aber einige Benutzer sind mit Sprachen wie Ruby vertrauter.Wie kann man ein beliebiges Shell-Skript ausführen und mehrere Variablen über Python übergeben?

Von dem, was ich gelesen habe, kann ich einfach Ruby-Skripte (oder andere beliebige Shell-Skripte) mit subprocess ausführen und erfassen ihre Ausgabe mit einer Pipe; Das ist kein Problem, und es gibt viele Beispiele online. Allerdings muss ich das Skript mit mehreren Variablen versehen (sagen wir ein Stück Text zusammen mit einigen einfachen Booleschen Informationen über den Text, den das Skript verändert) und ich habe Probleme herauszufinden, wie dies am besten funktioniert.

Hat jemand einen Vorschlag für den besten Weg, dies zu erreichen? Mein Ziel ist es, den Skripten die benötigten Informationen mit dem am wenigsten erforderlichen Code zur Verfügung zu stellen, der für den Zugriff auf diese Informationen im Skript erforderlich ist.

Vielen Dank im Voraus!

Antwort

4

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

args sollte von Programmargumenten eine Zeichenfolge oder eine Sequenz sein. Das Programm ausführen ist normalerweise das erste Element in die args-Sequenz oder die Zeichenfolge, wenn eine Zeichenfolge angegeben ist, kann aber explizit mithilfe des ausführbaren Arguments festgelegt werden.

So kann Ihr Anruf wird wie folgt aussehen

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

Sie beliebige Python-Werte in die args von subprocess.Popen gesetzt haben.

+0

Ich selbst gefunden, aber das scheint nicht sehr freundlich für das Skript, da es dann durch Befehlszeilenargumente analysieren muss, wenn es die Daten will. Wenn es keine besseren Möglichkeiten gibt, werde ich damit gehen. Vielen Dank! –

+0

Was? Was bedeutet das? "da es [das Skript] dann durch Befehlszeilenargumente analysieren muss" Das ist was Skripte tun. Bitte aktualisieren Sie Ihre Frage, um zu erklären, was Ihr Anliegen oder Problem ist. –

+0

Ich muss den Weg finden, Variablen aus meinem Python-Code in die Nicht-Python-Skripte zu bekommen, die den geringsten Code in den Nicht-Python-Skripten benötigen.Die Skripte werden von anderen erstellt, und je weniger Anforderungen sie erfüllen, desto höher ist die Wahrscheinlichkeit, dass sie sie schreiben. –

1

Wenn Sie mehrere Skripts starten und dieselben Informationen an alle weitergeben müssen, sollten Sie die Umgebung in Betracht ziehen (Warnung, ich kenne Python nicht, daher ist der folgende Code höchstwahrscheinlich nervtötend):

#!/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

ein Ansatz Sie nehmen könnten, wäre json als Protokoll zwischen Eltern und Kind-Skripte zu verwenden, da json Unterstützung in vielen Sprachen leicht verfügbar ist, und ist ziemlich ausdrucksvoll. Sie können auch eine Pipe verwenden, um eine beliebige Menge an Daten an den untergeordneten Prozess zu senden, vorausgesetzt, Ihre Anforderungen ermöglichen Ihnen, die untergeordneten Skripts von der Standardeingabe lesen zu lassen. Zum Beispiel könnten die Eltern tun so etwas wie (Python 2.6 gezeigt):

#!/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) 

Und hier ist eine Skizze eines Kindes Skript:

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

import json 
import sys 

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

In diesem triviales Beispiel ist die Ausgabe:

 
$ ./foo12.py 
{u'text': u'Twas brillig...', u'flag2': True, u'flag1': False} 
Verwandte Themen