使用python执行mysqldump并通过stdin设置密码
我想在python中执行mysqldump,并在从mysqldump请求时提供密码 在命令行中添加密码不是选项,必须通过stdin提供 这就是我到目前为止所做的: 命令=[ “mysqldump”, “-h”,mysqlhost, “-P”,mysqlport, '-u',mysqluser, “-p”, mysqldb ] 但当我执行代码时,终端挂起请求密码使用python执行mysqldump并通过stdin设置密码,python,mysql,subprocess,Python,Mysql,Subprocess,我想在python中执行mysqldump,并在从mysqldump请求时提供密码 在命令行中添加密码不是选项,必须通过stdin提供 这就是我到目前为止所做的: 命令=[ “mysqldump”, “-h”,mysqlhost, “-P”,mysqlport, '-u',mysqluser, “-p”, mysqldb ] 但当我执行代码时,终端挂起请求密码 谢谢。您可以使用pexpect。这是经过修改的代码,因为我必须对其进行测试,但您知道: import pexpect command2
谢谢。您可以使用pexpect。这是经过修改的代码,因为我必须对其进行测试,但您知道:
import pexpect
command2 = 'mysqldump -h localhost -u root -p xyzzy'
mysqlfile = "/tmp/foo.sql"
with open(mysqlfile, "w+") as file:
p = pexpect.spawn(command2)
p.expect("Enter password: ")
p.sendline("foobar")
q = p.read()
p.wait()
file.write(q)
这里的“foobar”是我的数据库密码
汉努对我来说,公认的答案并不能解决问题。大概它与我正在使用的python版本3.5有关 我遇到的困难是:
p.read()
正在阻止进程(我总是在某个时候终止脚本).read(1024)
返回整数,其中字符串是file.write(…)
所期望的。我假设这与Python2和Python3中处理unicode的方式不同有关,因为将参数encoding='utf-8'
添加到pexpect.spawn()
给了我正确的结果。然而,随后我不得不修改文件s.t的编写。它也支持unicode的另一个问题是,在mysqldump将转储写入stdout之前,我经历了从读取到完成的过程。我猜在这种情况下,mysqldump的交付速度太慢了。我更改了我的解决方案,s.t.它等待EOF
#!/usr/bin/env python3
import pexpect
import io
cmd = 'mysqldump -u MYSQL_USER -p DATABASES(S)'
sqlfile = "/home/user/test-database-dump.sql"
password = 'secret'
with io.open(sqlfile, 'w', encoding="utf-8") as file:
print('Calling mysqldump...')
p = pexpect.spawn(cmd,encoding='utf-8')
p.expect("Enter password: ")
# Send password to mysqldump
p.sendline(password)
# Capture the dump
print('Reading dump from process and writing it to file...')
while not p.eof():
chunk = p.readline()
file.write(chunk)
print('Finished.')
p.close()
print(p.exitstatus, p.signalstatus)
你想让它提示密码并等待用户输入,还是尝试从代码中输入字符串作为输入?我想从代码中输入字符串谢谢,但现在它挂在p.read()上,如果我对这行进行注释,它将挂在p.wait()函数中,并且永远不会结束。它适合我。是否确实已在p.expect()中准确键入所提示的内容?如果您缺少某个字符或有额外的字符,则该字符将不匹配,并且永远不会通过该字符。您可以通过添加p=pexpect.spawn(command2,logfile=sys.stdout)来调试它。您将在屏幕上看到发生了什么,提示了什么,输出了什么。如果您的数据库很大,那么p.read()当然需要花费大量的时间。在这种情况下,您可能需要分块处理,因为它现在读取内存中的整个转储。您好,Hannu,是的,日志文件只是时间问题,我可以看到它正在正确导出数据库,但是使用p.read()和file.write()需要太多时间。在控制台中使用mysqldump命令需要3或4秒,使用pexpect需要30秒以上,超时被触发。如何解决这个问题?尝试将timeout=None添加到pexpect.spawn(command2,timeout=None,logfile=sys.stdout)。这里有一个指向pexpect文档的链接:我已经找到了解决方案,在p.read(1024):file.write(chunk)中为chunk使用
,它运行良好,速度快,并且结束正确。我不知道为什么p.read()会阻塞并且永远不会结束。
#!/usr/bin/env python3
import pexpect
import io
cmd = 'mysqldump -u MYSQL_USER -p DATABASES(S)'
sqlfile = "/home/user/test-database-dump.sql"
password = 'secret'
with io.open(sqlfile, 'w', encoding="utf-8") as file:
print('Calling mysqldump...')
p = pexpect.spawn(cmd,encoding='utf-8')
p.expect("Enter password: ")
# Send password to mysqldump
p.sendline(password)
# Capture the dump
print('Reading dump from process and writing it to file...')
while not p.eof():
chunk = p.readline()
file.write(chunk)
print('Finished.')
p.close()
print(p.exitstatus, p.signalstatus)