Python的Subprocess删除Mysql列和间距

时间:2015-03-16 19:18:56

标签: python mysql bash subprocess

具体来说,我正在使用:

Python 2.4.3 (#1, May 24 2008, 13:47:28) 
[GCC 4.1.2 20070626 (Red Hat 4.1.2-14)] on linux2

我正在尝试使用列名和边框获取mysql查询的原始结果。这是在bash中运行的原始命令:

[root@machine ~]# mysql -u root -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| dbA                |
| dbB                |
| dbC                |
+--------------------+

我无法将此值存储到Python中的变量中:

import subprocess

cmd_array = ["mysql", "-u", "root", "-e", "show databases"]

p = subprocess.Popen(cmd_array)
raw_data = p.communicate()[0]

# Console outputs:
# +--------------------+
# | Database           |
# +--------------------+
# | dbA                |
# | dbB                |
# | dbC                |
# +--------------------+
#
# raw_data is None

p = subprocess.Popen(cmd_array, stdout=subprocess.PIPE)
rawData = p.communicate()[0]
print rawData

# Console outputs:
# Database
# dbA
# dbB
# dbC
#
# rawData is "Database\ndbA\ndbB\ndbC"

在python变量中存储漂亮的mysql输出版本的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

您需要使用-t

p = check_output(["mysql" ,"-u" ," root", "-t" ,"-e",  'show databases;'])
print(p)

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| world              |
+--------------------+

您也可以使用check_output存储输出。

答案 1 :(得分:0)

mysql的操作方式不同,具体取决于是从控制台调用(伪终端,pty)还是从其他程序调用。当从另一个程序调用时,它有目的地简化以便于解析。考虑它的一种方法是

"Database\ndbA\ndbB\ndbC"

原始结果

+--------------------+
| Database           |
+--------------------+
| dbA                |
| dbB                |
| dbC                |
+--------------------+

是一个非常印刷的人的结果。

我不知道"列可见字符串" 是什么,但是如果你想处理程序中的数据,你就可以得到你想要的简单解析结果。 / p>

如果您确实需要花哨的打印版本,可以使用pexpectpty模块来模拟终端。这是一个例子:

>>> import pexpect
>>> import subprocess
>>> child = pexpect.spawn('mysql -e "show databases"')
>>> child.expect(pexpect.EOF)
0
>>> print child.before
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+

答案 2 :(得分:0)

看起来mysql使用isatty()来确定STDOUT是否是终端然后修改输出。

我可以通过指定--table-t选项来获取表格边框:

cmd_array = ["mysql", "-t", "-u", "root", "-e", "show databases"]