通过Python的子进程模块运行mysqldump是缓慢而冗长的

时间:2010-10-13 02:57:16

标签: python mysql import subprocess

@cost_time
def dbdump_all():
    "导出数据库所有数据至当前目录下以年月日命名的sql文件"
    filename=datetime.datetime.now().strftime("%Y-%m-%d")
    cmd="""mysqldump -u root -pzhoubt --opt --quick --database search > ./%s.sql"""%filename
    args=shlex.split(cmd)
    p=subprocess.Popen(args)
    #stdout, stderr = p.communicate()
    #print stdout,stderr
    print "已将数据库表结构和数据导出到%s"%filename

我在子进程中使用mysqldump命令,即使我注释掉stdout, stderr = p.communicate()行,它也会输出大量有关导出数据的信息。它也很慢,即使我在shell中尝试了相同的命令,它也非常快速和简洁。如何在使用subprocess时避免所有冗长,并加快直接从shell运行它所需的时间?

1 个答案:

答案 0 :(得分:2)

@cost_time
def dbdump_all():
    "导出数据库所有数据至当前目录下以年月日命名的sql文件"
    filename=datetime.datetime.now().strftime("%Y-%m-%d")+".sql"
    cmd="""mysqldump -u root -pzhoubt --opt --quick --database search >./%s"""%filename
    print cmd
    p=subprocess.Popen(cmd,shell=True,cwd=os.getcwd())
    sts = os.waitpid(p.pid, 0)[1]
    print "返回状态%s"%sts
    print "已将数据库表结构和数据导出到%s"%filename

最后我明白了, 关键是我们os.waitpid等待mysql处理, 另一点是当你使用shell时,cmd是一个不是列表的字符串