我正在使用Python构建一个应用程序插件,允许用户使用简单的脚本(在Mac OS X下工作)任意扩展应用程序。执行Python脚本很简单,但有些用户对Ruby等语言更为熟悉。
根据我的阅读,我可以使用subprocess
轻松执行Ruby脚本(或其他任意shell脚本),并使用管道捕获其输出;这不是问题,网上有很多例子。但是,我需要为脚本提供多个变量(比如一大块文本以及一些关于脚本正在修改的文本的简单布尔信息),并且我无法找到最佳方法。
有没有人建议最好的方法来实现这一目标?我的目标是为脚本提供所需的信息,以及在脚本中访问该信息所需的最少代码。
提前致谢!
答案 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}