【问题标题】:using subprocess.call with mysqldump将 subprocess.call 与 mysqldump 一起使用
【发布时间】:2014-06-08 06:20:26
【问题描述】:

多年来,我一直在使用 Windows 编写脚本,最近几周才开始将 python 作为替代方案。我正在尝试编写一个本机 python 脚本来使用 mysqldump 备份一个 mysql 数据库。我通常使用命令行管道输出 > 没有问题。

我看到很多关于 subprocess.popen 和 shell=True 的答案,同样我看到很多声明说我应该避免使用 shell=True

所以我试图让以下代码将我的标准输出重定向到一个文件,但都没有成功

sys.stdout=open("mysqldump.txt",'w')
print("testing line1")
subprocess.check_output(["mysqldump", "-u", "usernmae", "-ppassword", "-h", "dbserver_name", database_name])

如果我注释掉 sys.sdout 行,我会看到 sqldump 输出到我的屏幕,所以我知道这部分的语法是正确的。我添加了打印语句,可以看到它被写入文件 mysqldump.txt。但是当完全运行时,不会转储到屏幕或文件中

有什么想法吗?我试图避免使用 shell 解决方案

【问题讨论】:

    标签: python subprocess mysqldump


    【解决方案1】:

    您尝试执行的操作不起作用,因为修改 sys.stdout 只会影响 Python 级别的语句,例如 print,不会影响来自 C 的较低级别的写入,尤其不会影响外部程序执行的那些。您想告诉subprocess 创建一个管道,就像您使用> 重定向所做的那样,如下所示:

    with open("mysqldump.txt",'w') as out:
        subprocess.check_call(["mysqldump", "-u", "usernmae", "-ppassword",
                               "-h", "dbserver_name", database_name],
                              stdout=out)
    

    【讨论】:

    • 什么是dbserver_name?是本地主机吗?
    • @OPV 大概是运行数据库的服务器的主机名。 mysqldump 的参数是从问题中复制的,您必须向 OP(或咨询 the documentation)询问它们的含义。
    【解决方案2】:

    您可以为 mysqldump 使用 --result-file=file 参数吗?

    可能需要将 check_output 更改为 subprocess.call 才能完成。

    subprocess.call(["mysqldump", "-u", "usernmae", "-ppassword", "-h", "dbserver_name", database_name],stdout=open('myfile.txt','w'))
    

    编辑:myfile.txt 将在子进程完成后关闭。

    【讨论】:

    • 谢谢,这也有效。两个很好的答案,我花了很长时间尝试各种方法
    • 我需要 15 的声誉 :-( 在 stackoverflow 上还是新的
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2017-10-14
    • 1970-01-01
    • 2013-02-13
    • 2012-12-29
    相关资源
    最近更新 更多