通过Python的subprocess模块运行mysqldump速度慢且冗长

1 投票
1 回答
1073 浏览
提问于 2025-04-16 05:24
@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()这一行注释掉了。这个过程也很慢,尽管我在命令行中运行同样的命令时,它又快又简洁。我该如何在使用subprocess时避免这些冗长的输出,并让它的运行速度更接近直接在命令行中执行的速度呢?

1 个回答

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 的时候,命令是一个字符串,而不是一个列表。

撰写回答