我在 linux 上,我有一个要从另一个 python 脚本调用的 python 脚本。我不想将它作为一个模块导入(为了一层安全性,现在是为了学术练习,因为我想弄清楚这一点),我希望实际上有一个脚本调用另一个脚本 os.system() 或另一个类似的函数,并让另一个脚本将元组列表返回给第一个脚本。
我知道这可能不是最好的方法,但我想尝试一下,并在此过程中学习一些东西。
导入模块不同于将其作为脚本执行。如果您不信任子 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']
execfile()
在 Python 中很少使用。它可能在调试器、分析器或在setup.py
诸如.pip
easy_install
另见runpy
模块。
如果另一个脚本在不同的进程中执行;您可以使用许多IPC 方法。最简单的方法是将序列化(Python 对象转换为字节串)输入 args 输入到子进程的标准输入中,并按照@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
这很简单。
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