Как уже упоминалось в комментариях, вы должны return
значения из вспомогательного скрипта. Если их несколько, добавьте их в список или словарь (для этого удобно использовать namedtuple
).
Ключ в том, что вам нужно присвоить результат execfile
переменной в скрипте сервера. Это не должно быть что-то серьезное, его можно просто выбросить прямо в коллекцию, такую как список.
Код на основе возврата
Основной файл
class Stuff():
def __init__(self, f):
self.f = f
self.log = {}
self.storage = []
def execute(self, filename):
self.storage.append(execfile(filename))
if __name__ == '__main__':
#start this script as server
clazz = Stuff()
#here helper_script name will be provided by client at runtime
clazz.execute(helper_script)
Вспомогательный файл (helper.py)
a = 3
b = 4
return (a, b)
Стандартный вариант
Альтернативный подход заключается в том, чтобы вспомогательный файл печатал результаты, но перенаправлял stdout
. Это довольно тривиально, если вы используете subprocess
и подробно описано в документации (могу добавить пример, если это будет полезно). Я менее знаком с подходом exec / execfile
, чем subprocess
, но есть объяснение этого SO вопроса .
В случае, если что-то случится с другим вопросом SO, здесь скопирован код для двух примеров:
Фредерик Хамиди
code = """
i = [0,1,2]
for j in i :
print j
"""
from cStringIO import StringIO
old_stdout = sys.stdout
redirected_output = sys.stdout = StringIO()
exec(code)
sys.stdout = old_stdout
print redirected_output.getvalue()
Йохен Ритцель
import sys
import StringIO
import contextlib
@contextlib.contextmanager
def stdoutIO(stdout=None):
old = sys.stdout
if stdout is None:
stdout = StringIO.StringIO()
sys.stdout = stdout
yield stdout
sys.stdout = old
code = """
i = [0,1,2]
for j in i :
print j
"""
with stdoutIO() as s:
exec code
print "out:", s.getvalue()