使用python捕获mysql select语句的输出
使用Python2.4,我想从mysql命令捕获输出。需要注意的一点是,我需要使用echo对SQL语句进行管道处理使用python捕获mysql select语句的输出,python,Python,使用Python2.4,我想从mysql命令捕获输出。需要注意的一点是,我需要使用echo对SQL语句进行管道处理 echo 'SELECT user FROM mysql.user;' | mysql 我看到了使用call、os.system和popen的示例,但对于我的python版本,最好使用什么并捕获元组中的输出 感谢子流程模块是运行命令和控制输入输出的最灵活的工具。以下命令运行命令并将输出捕获为行列表: import subprocess p = subprocess.Popen(
echo 'SELECT user FROM mysql.user;' | mysql
我看到了使用call、os.system和popen的示例,但对于我的python版本,最好使用什么并捕获元组中的输出
感谢子流程模块是运行命令和控制输入输出的最灵活的工具。以下命令运行命令并将输出捕获为行列表:
import subprocess
p = subprocess.Popen(['/bin/bash', '-c', "echo 'select user from mysql.user;' | mysql" ],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
lines = [line for line in p.stdout]
在Windows上,bash-c将被cmd/c替换。而您是通过CLI工具而不是DB-API来执行此操作的。为什么又是这样呢?我将执行随机CLI命令,而不仅仅是这一个命令,我不想麻烦任何DB模块。这个字符串可能是最完整的。使用像oursql这样的库将更简单、更直接、更安全、更健壮。它不会阻止您将子流程用于适合的任务。没有理由运行
/bin/bash
。如果有理由使用shell,只需使用shell=True
,但在这种情况下,没有理由使用shell,只需将查询直接传递给流程即可。(与使用像oursql或MySQLdb这样的模块相比,这都是些小东西。)此外,[p.stdout中的行对行]
是一种非常愚蠢的方法,当有list(p)
和p.communicate()
这样的选项时。