从另一个python脚本获取返回信息

时间:2013-06-01 21:15:14

标签: python linux

我在linux上,我有一个python脚本,我想从另一个python脚本调用。我不想将它作为一个模块导入(对于一个安全层,现在用于学术练习,因为我想弄清楚这一点),我想实际上有一个脚本用os.system()调用另一个脚本这样的另一个函数,并让另一个脚本返回第一个脚本的元组列表。

我知道这可能不是最佳方式,但我想尝试一下,并在此过程中学习一些东西。

5 个答案:

答案 0 :(得分:4)

您可以使用subprocess

subprocess.call(["python", "myscript.py"])

这也将返回进程返回值(例如0或1)。

答案 1 :(得分:3)

导入模块与将其作为脚本执行不同。如果你不相信孩子的Python脚本;你不应该从中运行任何代码。

使用其他Python模块中的某些代码的常规方法:

import another_module

result = another_module.some_function(args)

如果您想执行它而不是导入:

namespace = {'args': [1,2,3]} # define __name__, __file__ if necessary
execfile('some_script.py', namespace)
result = namespace['result']
在Python中很少使用

execfile()。它可能在调试器,分析器或在setup.pypip等工具中运行easy_install时很有用。

另见runpy module

如果在另一个进程中执行另一个脚本;你可以使用很多IPC methods。最简单的方法是将管道序列化(转换为字节串的Python对象)输入args转换为子进程'stdin,并将结果从其标准输出读回suggested by @kirelagin

import json
import sys
from subprocess import Popen, PIPE

marshal, unmarshal = json.dumps, json.loads

p = Popen([sys.executable, 'some_script.py'], stdin=PIPE, stdout=PIPE)
result = unmarshal(p.communicate(marshal(args))[0])

some_script.py可以是:

#!/usr/bin/env python
import json
import sys

args = json.load(sys.stdin)   # read input data from stdin
result = [x*x for x in args]  # compute result
json.dump(result, sys.stdout) # write result to stdout

答案 2 :(得分:2)

您需要某种序列化来返回列表。我建议pickleJSON

您的其他脚本会将其打印到stdout,调用脚本会将其读回并反序列化。

答案 3 :(得分:1)

您知道,ZMQ对于进程间通信非常有用。您可以将它与json对象一起使用。

以下是python binding

答案 4 :(得分:0)

这很简单。

import popen2
fout, fin = popen2.popen2('python your_python_script.py')
data = fout.readline().strip()
if data <> '':
    # you have your `data`, so do something with it