Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python执行mysqldump并通过stdin设置密码_Python_Mysql_Subprocess - Fatal编程技术网

使用python执行mysqldump并通过stdin设置密码

使用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

我想在python中执行mysqldump,并在从mysqldump请求时提供密码

在命令行中添加密码不是选项,必须通过stdin提供

这就是我到目前为止所做的: 命令=[ “mysqldump”, “-h”,mysqlhost, “-P”,mysqlport, '-u',mysqluser, “-p”, mysqldb ]

但当我执行代码时,终端挂起请求密码


谢谢。

您可以使用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()
    正在阻止进程(我总是在某个时候终止脚本)
  • David Rojo的区块方法没有阻塞,但是
    .read(1024)
    返回整数,其中字符串是
    file.write(…)
    所期望的。我假设这与Python2和Python3中处理unicode的方式不同有关,因为将参数
    encoding='utf-8'
    添加到
    pexpect.spawn()
    给了我正确的结果。然而,随后我不得不修改文件s.t的编写。它也支持unicode
  • p.read(1024):-方法中chunk的
    的另一个问题是,在mysqldump将转储写入stdout之前,我经历了从读取到完成的过程。我猜在这种情况下,mysqldump的交付速度太慢了。我更改了我的解决方案,s.t.它等待EOF
  • 注意:我几天前才开始学习python,如果我的假设或结论是错误的或误导性的,请纠正我

    代码示例 下面的脚本是我调用mysqldump并在mysqldump请求时提供密码的最简单的工作示例:

    #!/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)