2

我正在用 Python 构建一个应用程序插件,它允许用户使用简单的脚本(在 Mac OS X 下工作)任意扩展应用程序。执行 Python 脚本很容易,但有些用户更喜欢 Ruby 等语言。

根据我的阅读,我可以使用subprocess管道轻松执行 Ruby 脚本(或其他任意 shell 脚本)并捕获它们的输出;这不是问题,网上有很多例子。但是,我需要为脚本提供多个变量(比如一段文本以及一些关于脚本正在修改的文本的简单布尔信息),我无法找出最好的方法来做到这一点。

有没有人建议最好的方法来实现这一点?我的目标是用最少的代码为脚本提供他们需要的信息,以便在脚本中访问该信息。

提前致谢!

4

3 回答 3

4

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

args 应该是一个字符串,或一系列程序参数。要执行的程序通常是 args 序列中的第一项,如果给定了字符串,则为字符串,但可以使用可执行参数显式设置。

所以,你的电话可能看起来像这样

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

您可以采用的一种方法是使用 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 回答