我有一个连接数据库并获取结果的文件。现在文件必须使用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()
现在的问题是,当我从db获取输出时,我必须执行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
。有可能吗?你知道吗
您需要序列化和反序列化两端的数据。最简单的解决方案是使用Python的
pickle
模块,并希望在python3端序列化的类型与反序列化python2端的类型足够相似。您需要将发送端使用的协议指定为接收端可以理解的版本:子进程调用更安全的接收器(中间没有shell进程):
发送方,显式选择Python 2仍能理解的pickle协议:
如果由于python2和python3之间的(反)序列化对象的不同而无法工作,那么您必须退回到显式(反)序列化数据,例如在JSON中,正如Jay的注释所建议的那样。你知道吗
相关问题 更多 >
编程相关推荐