Вызов python script со входом в python script с использованием подпроцесса

У меня есть script a.py, и во время его выполнения он запрашивает определенные запросы пользователю и формирует вывод в формате json. Используя подпроцесс python, я могу вызвать этот script из другого script с именем b.py. Все работает как ожидалось, за исключением того, что я не могу получить результат в переменной? Я делаю это в Python 3.

Ответ 1

Чтобы вызвать Python script из другого с помощью модуля subprocess и передать ему некоторый ввод и получить его вывод:

#!/usr/bin/env python3
import os
import sys
from subprocess import check_output

script_path = os.path.join(get_script_dir(), 'a.py')
output = check_output([sys.executable, script_path],
                      input='\n'.join(['query 1', 'query 2']),
                      universal_newlines=True)

где get_script_dir() функция определена здесь.

Более гибкой альтернативой является импорт модуля a и вызов функции для получения результата (убедитесь, что a.py использует if __name__=="__main__" guard, чтобы избежать запуска нежелательного кода при импорте):

#!/usr/bin/env python
import a # the dir with a.py should be in sys.path

result = [a.search(query) for query in ['query 1', 'query 2']]

Вы можете использовать mutliprocessing для запуска каждого запроса в отдельном процессе (если выполнение запроса имеет интенсивность процессора, тогда это может улучшить производительность):

#!/usr/bin/env python
from multiprocessing import freeze_support, Pool
import a

if __name__ == "__main__":
   freeze_support()
   pool = Pool() # use all available CPUs
   result = pool.map(a.search, ['query 1', 'query 2'])

Ответ 2

Другим способом, чем упоминалось, является использование встроенного funtion exec
Эта функция получает строку кода python и выполняет ее
Чтобы использовать его в файле script, вы можете просто read его как текстовый файл:

#dir is the directory of a.py
#a.py, for example, contains the variable 'x=1'
exec(open(dir+'\\a.py').read())
print(x) #outputs 1