我在linux上,我有一个python脚本,我想从另一个python脚本调用。我不想将它作为一个模块导入(对于一个安全层,现在用于学术练习,因为我想弄清楚这一点),我想实际上有一个脚本用os.system()调用另一个脚本这样的另一个函数,并让另一个脚本返回第一个脚本的元组列表。
我知道这可能不是最佳方式,但我想尝试一下,并在此过程中学习一些东西。
答案 0 :(得分:4)
答案 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.py
,pip
等工具中运行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)
答案 3 :(得分:1)
您知道,ZMQ对于进程间通信非常有用。您可以将它与json对象一起使用。
答案 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