使用subprocess.call和mysqldump

5

我已经使用Windows脚本编程多年,最近几周才开始考虑Python作为替代方法。我试图编写一个本地的Python脚本来备份MySQL数据库,并使用mysqldump进行操作。通常情况下,我使用命令行将输出重定向到文件而没有问题。

我看到很多答案都是用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.stdout那一行,我会看到sqldump输出到我的屏幕上,所以我知道这部分的语法是正确的。我添加了print语句并且可以看到它被写入了文件mysqldump.txt。但是当全部运行时没有输出到屏幕或文件中。
有什么想法吗?我正在尝试避免使用shell解决方案。
2个回答

6
你试图修改 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
@OPV 可能是数据库运行的服务器主机名。mysqldump 的参数是从问题中复制的,您需要询问 OP(或查阅文档)了解它们的含义。 - user4815162342

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 将关闭。


谢谢,这个也行。两个很好的答案,我花了很长时间尝试各种方法。 - Rob
我需要一个15的声望:-( 在stackoverflow上还很新。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接