繁体   English   中英

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

[英]How to execute an arbitrary shell script and pass multiple variables via Python?

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

通过阅读,我可以轻松地使用subprocess执行Ruby脚本(或其他任意的shell脚本),并通过管道捕获其输出; 这不是问题,在线上有很多示例。 但是,我需要为脚本提供多个变量(例如,一段文本以及有关该脚本正在修改的文本的一些简单布尔信息),并且我在寻找实现此目的的最佳方法时遇到了麻烦。

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

提前致谢!

请参阅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值进入的ARGS subprocess.Popen

如果您要启动多个脚本并需要向每个脚本传递相同的信息,则可以考虑使用环境(警告,我不了解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__)

您可以采取的一种方法是将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}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM