我已经使用windows编写了多年的脚本,并且在过去的几周里才开始将python作为替代品。我试图编写一个本机python脚本来使用mysqldump备份mysql数据库。我通常使用命令行管道输出>没有问题。
我看到subprocess.popen和shell = True有很多答案,同样我看到很多声明说我应该避免shell = True
所以我试图让以下代码将我的stdout重定向到一个文件,但都没有成功
sys.stdout=open("mysqldump.txt",'w')
print("testing line1")
subprocess.check_output(["mysqldump", "-u", "usernmae", "-ppassword", "-h", "dbserver_name", database_name])
如果我注释掉sys.sdout行,我会看到sqldump输出到我的屏幕,所以我知道我的语法正确。我添加了print语句,可以看到它被写入文件mysqldump.txt。但是当完全运行时,屏幕或文件没有转储
有什么想法吗?我试图避免使用shell解决方案
答案 0 :(得分:5)
您尝试做的事情并不起作用,因为修改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)
答案 1 :(得分: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将在子进程完成后关闭。