如何在python2中捕获在python3中运行的命令的输出?

2024-04-19 17:19:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个连接数据库并获取结果的文件。现在文件必须使用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。有可能吗?你知道吗


Tags: 模块文件importcmdexecutedbgetdatetime
1条回答
网友
1楼 · 发布于 2024-04-19 17:19:18

您需要序列化和反序列化两端的数据。最简单的解决方案是使用Python的pickle模块,并希望在python3端序列化的类型与反序列化python2端的类型足够相似。您需要将发送端使用的协议指定为接收端可以理解的版本:

子进程调用更安全的接收器(中间没有shell进程):

#!/usr/bin/env python
import pickle
import subprocess


def execute_python3(param):
    result = subprocess.check_output(['python3', 'get_db_result.py', param])
    return pickle.loads(result)


def main():
    execute_python3(sql_query)


if __name__ == '__main__':
    main()

发送方,显式选择Python 2仍能理解的pickle协议:

#!/usr/bin/env python3
import sys
import pickle


def get_result():
    param = sys.argv[1]
    '''
    Logic to get result from db
    '''
    result = db_output
    pickle.dump(result, sys.stdout.buffer, protocol=2)


if __name__ == '__main__':
    get_result()

如果由于python2和python3之间的(反)序列化对象的不同而无法工作,那么您必须退回到显式(反)序列化数据,例如在JSON中,正如Jay的注释所建议的那样。你知道吗

相关问题 更多 >