【发布时间】:2011-04-05 18:47:23
【问题描述】:
我在尝试构建简单的备份/升级数据库脚本时遇到问题。
错误在使用子进程的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.stdout 和sys.stderr 重定向到文件,以便拥有一个日志系统。
在那些日志中,我发现了错误:
[mysqldump --user=xxxxxx --password=yyyyyyyy database_name | 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
显然,如果我在终端中尝试该命令,它会起作用。
【问题讨论】:
-
逗号加空格,加号不加。 domaindb 和管道以加号连接。也许这就是问题所在?不知道为什么要用逗号连接字符串,而不是仅仅使用空格并将它们放在相同的引号内。
-
Becose im newbie in python ;) 无论如何,我想我必须使用 +,因为
--user=和 db_user 之间必须没有空格.. 正确的形式应该是--user=foo,还是我弄错了?
标签: python subprocess mysqldump