我需要来自MySQL的超快速响应,因此我试图通过直接连接到MySQL来处理此问题:
command = ['mysql', '-u', 'root', '-p']
proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
(out, err) = proc.communicate("password")
但是使用此代码,我没有任何回应。
subprocess.Popen()
通话中缺少的一件事是stdin=subprocess.PIPE
。从docs:
注意,如果要将数据发送到流程的stdin,则需要使用stdin = PIPE创建Popen对象。
proc = subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
但是,我不确定这是否仍然有效。我建议使用pymysql
(https://github.com/PyMySQL/PyMySQL)。
这是使用pymysql创建连接的示例:
import pymysql.cursors
connection = pymysql.connect(host='localhost',
user='root',
password='password',
db='my database',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
我通过这种方式解决了我的问题:
proc = subprocess.Popen("mysql -h localhost -u root -pMYPASSWORD dbname",
stderr=subprocess.STDOUT,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
shell=True)
现在我可以进行查询:
(out, err) = proc.communicate(b"SELECT * FROM AnyTable;")
print("out", out.decode('utf-8'))