4

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

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

4

5 回答 5

4

您可以使用subprocess

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

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

于 2013-06-01T21:16:28.920 回答
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']

execfile()在 Python 中很少使用。它可能在调试器、分析器或在setup.py诸如.pipeasy_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
于 2013-06-02T12:42:26.923 回答
2

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

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

于 2013-06-01T21:17:32.567 回答
1

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

这是python绑定

于 2013-06-01T21:43:16.823 回答
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  
于 2013-06-02T12:57:53.747 回答