Python 的子进程删除 Mysql 列和间距
Python's Subprocess removing Mysql columns and spacing
具体来说,我正在使用:
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 查询的原始结果。这是原始命令 运行 in 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"
将 mysql 输出的漂亮打印版本存储在 python 变量中的最佳方法是什么?
mysql
根据是从控制台(伪终端,pty)调用还是从另一个程序调用,其操作方式不同。当从另一个程序调用时,它有意简洁以便于解析。一种思考方式是
"Database\ndbA\ndbB\ndbC"
是原始结果,
+--------------------+
| Database |
+--------------------+
| dbA |
| dbB |
| dbC |
+--------------------+
对人们来说是一个漂亮的印刷结果。
我不知道 "column visible string" 是什么,但是如果你想在你的程序中处理数据,你会得到你想要的易于解析的结果。
如果您真的想要花哨的打印版本,可以使用 pexpect
或 pty
模块来模拟终端。这是一个例子:
>>> import pexpect
>>> import subprocess
>>> child = pexpect.spawn('mysql -e "show databases"')
>>> child.expect(pexpect.EOF)
0
>>> print child.before
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
你需要使用-t
:
p = check_output(["mysql" ,"-u" ," root", "-t" ,"-e", 'show databases;'])
print(p)
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| world |
+--------------------+
您也可以使用 check_output
来存储输出。
看起来 mysql
使用 isatty()
来确定 STDOUT 是否是一个终端,然后修改输出。
我可以通过指定 --table
或 -t
选项来获得 table 边框:
cmd_array = ["mysql", "-t", "-u", "root", "-e", "show databases"]
具体来说,我正在使用:
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 查询的原始结果。这是原始命令 运行 in 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"
将 mysql 输出的漂亮打印版本存储在 python 变量中的最佳方法是什么?
mysql
根据是从控制台(伪终端,pty)调用还是从另一个程序调用,其操作方式不同。当从另一个程序调用时,它有意简洁以便于解析。一种思考方式是
"Database\ndbA\ndbB\ndbC"
是原始结果,
+--------------------+
| Database |
+--------------------+
| dbA |
| dbB |
| dbC |
+--------------------+
对人们来说是一个漂亮的印刷结果。
我不知道 "column visible string" 是什么,但是如果你想在你的程序中处理数据,你会得到你想要的易于解析的结果。
如果您真的想要花哨的打印版本,可以使用 pexpect
或 pty
模块来模拟终端。这是一个例子:
>>> import pexpect
>>> import subprocess
>>> child = pexpect.spawn('mysql -e "show databases"')
>>> child.expect(pexpect.EOF)
0
>>> print child.before
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
你需要使用-t
:
p = check_output(["mysql" ,"-u" ," root", "-t" ,"-e", 'show databases;'])
print(p)
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| world |
+--------------------+
您也可以使用 check_output
来存储输出。
看起来 mysql
使用 isatty()
来确定 STDOUT 是否是一个终端,然后修改输出。
我可以通过指定 --table
或 -t
选项来获得 table 边框:
cmd_array = ["mysql", "-t", "-u", "root", "-e", "show databases"]