使用subprocess.call进行mysqldump

5 投票
2 回答
2370 浏览
提问于 2025-04-18 09:00

我在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.stdout那一行注释掉,我能看到mysqldump的输出在屏幕上,所以我知道这一部分的语法是正确的。我加了一个打印语句,能看到这个内容被写入到mysqldump.txt文件里。但是当我完整运行时,屏幕和文件里都没有任何输出。

有没有什么想法?我想避免使用shell的解决方案。

2 个回答

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会在子进程完成后关闭。

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)

撰写回答