如何执行任意shell脚本并通过Python传递多个变量?

时间:2009-04-03 15:10:33

标签: python ruby macos shell environment-variables

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

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

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

提前致谢!

3 个答案:

答案 0 :(得分:4)

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

  

args应该是一个字符串或一个序列   程序参数。该计划   execute通常是第一项   args序列或字符串如果a   给出了字符串,但可以显式   使用可执行参数设置。

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

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

您已将任意Python值放入subprocess.Popen

的参数中

答案 1 :(得分:1)

如果您要启动多个脚本并需要将相同的信息传递给每个脚本,您可以考虑使用该环境(警告,我不知道Python,因此以下代码很可能很糟糕):< / p>

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

答案 2 :(得分: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}