使用subprocess.call进行mysqldump
我在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)