У меня есть файл, который подключается к базе данных и получает результат. Теперь файл должен быть запущен с использованием python 3
, а мой проект использует python 2.7
. Поэтому я запускаю файл как командную строку, используя модуль subprocess
. Вот как я называю файл.
import subprocess
import ast
def execute_python3(param):
param = param.replace("\\", "")
param = "\"" + param + "\""
cmd = "python3 " + "get_db_result.py" + " " + param
result = subprocess.check_output(cmd, shell=True)
return ast.literal_eval(result)
execute_python3(sql_query)
Здесь в команде я передаю sql-запрос в файл get_db_result
.
Файл get_db_result.py
выглядит примерно так
import sys
def get_result():
param = sys.argv[1]
'''
Logic to get result from db
'''
result = db_output
print(result)
if __name__ == "__main__":
get_result()
Теперь проблема заключается в том, что когда я выбираю вывод из базы данных, мне нужно сделать print
для вывода, который будет захвачен модулем subprocess
. Это затрудняет анализ выходных данных, которые будут использоваться программой для дальнейшей работы. Например, когда я получаю вывод, подобный этому
"[(u'Delhi', 20199330), (u'Mumbai', 134869470), (u'Kolkata', 6678446)]"
Это строковый список кортежей, который можно преобразовать в список кортежей, выполнив что-то вроде ast.literal_eval(result)
Но иногда я получаю вывод, как этот
"[(datetime.date(2019, 5, 27), 228.168093587), (datetime.date(2019, 5, 28), 228.834493641)]"
Здесь ast
не понимает datetime
. Даже json.loads()
не работает на этом.
Как мне захватить вывод из файла, не используя print
, и просто вернуть его обратно к subprocess
как есть. Это вообще возможно?