Импорт модуля отличается от его выполнения в качестве сценария. Если вы не доверяете дочернему скрипту 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
module.
Если другой скрипт выполнен в другом процессе; вы можете использовать много IPC methods. Самый простой способ, это просто труба сериализовать (объекты Python, преобразованные в виде массива байт) ввод арг Into подпроцесса 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
Спасибо! Я закончил его, но потому, что размер данных был приемлемо малым и легким для моделирования в виде строки, мне не нужно было сериализовать его. – Nathan