gpt4 book ai didi

Python 子进程、mysqldump 和管道

转载 作者:可可西里 更新时间:2023-11-01 07:49:19 25 4
gpt4 key购买 nike

我在尝试构建一个简单的备份/升级数据库脚本时遇到了问题。

错误是在使用子进程的 mysqldump 调用中:

cmdL = ["mysqldump", "--user=" + db_user, "--password=" + db_pass, domaindb + "|", "gzip", ">", databases_path + "/" + domaindb + ".sql.gz"]
print "%s: backup database %s \n\t[%s]" % (domain, domaindb, ' '.join(cmdL))
total_log.write("%s: backup database %s \n\t[%s] \n" % (domain, domaindb, ' '.join(cmdL)))
p = subprocess.Popen(cmdL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

在此之前,我将 sys.stdoutsys.stderr 重定向到文件,以便拥有一个日志系统。

在那些日志中,我发现错误:

[mysqldump --user=xxxxxx --password=yyyyyyyy 数据库名称 | gzip >/home/drush-backup/2010-08-30.15.37/db/database_name.sql][错误]:mysqldump:找不到表:“|”

似乎 | 字符被视为 mysqldump 参数,而不是管道。

查看 python 子进程文档,这是正常的,但我如何获得我需要的东西(调用命令 mysqldump --user=xxxxxx --password=yyyyyyyy database_name | gzip >/home/drush-backup/2010-08-30.15.37/db/database_name.sql)?

编辑 我刚在 python 文档上看到这个例子:

output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

我已经编辑了我的脚本:

command = ["mysqldump", "--user=" + db_user, "--password=" + db_pass, domaindb, "|", "gzip", ">", databases_path + "/" + domaindb + ".sql.gz"]
cmdL1 = ["mysqldump", "--user=" + db_user, "--password=" + db_pass, domaindb]
cmdL2 = ["gzip", ">", databases_path + "/" + domaindb + ".sql.gz"]

print "%s: backup database %s \n\t[%s]" % (domain, domaindb, ' '.join(command))
total_log.write("%s: backup database %s \n\t[%s] \n" % (domain, domaindb, ' '.join(command)))

p1 = subprocess.Popen(cmdL1, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
p2 = subprocess.Popen(cmdL2, stdin=p1.stdout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
cmdError, cmdData = p2.communicate()

现在命令变量只是为了方便在日志中使用。

这是下一步,但它在 > 流中停止,并出现以下错误:

[Error]: gzip: >: No such file or directory
gzip: /path/to/backups/dir/natabase_name.sql.gz: No such file or directory

显然,如果我在终端中尝试该命令,它会起作用。

最佳答案

我不确定管道将如何被解释。如果这是一个问题,您可以通过编程方式创建一个流水线。

来自: http://docs.python.org/library/subprocess.html#replacing-shell-pipeline

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

编辑

至于文件重定向,你可以将stdout指向一个文件..

stdin, stdout and stderr specify the executed programs’ standard input, standard output and standard error file handles, respectively. Valid values are PIPE, an existing file descriptor (a positive integer), an existing file object, and None.

例子:

out_file = open(out_filename, "wb")
gzip_proc = subprocess.Popen("gzip", stdout=out_file)
gzip_proc.communicate()

或者如果您采纳 Alex 的建议并使用 Python 的标准库 gzip模块,你可以这样做:

import gzip
import subprocess

...
#out_filename = path to gzip file

cmdL1 = ["mysqldump", "--user=" + db_user, "--password=" + db_pass, domaindb]
p1 = subprocess.Popen(cmdL1, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
dump_output = p1.communicate()[0]

f = gzip.open(out_filename, "wb")
f.write(dump_output)
f.close()

关于Python 子进程、mysqldump 和管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3600948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com