1

我在 Python 中编写了两个小函数来调用mysqldumpmysql从控制台调用,因此我能够创建数据库备份然后恢复它:

# Makes a backup current database status
def backupDatabase():
    if(os.path.exists('myDatabaseBackup.sql')):
        os.remove('myDatabaseBackup.sql')
    call(['mysqldump', '-u myUsername myDatabase > myDatabaseBackup.sql'])


# Restores database
def restoreDatabase():
    call(['mysql', '-u myUsername myDatabase < myDatabaseBackup.sql'])

然而,他们没有工作。我已经读过该调用获取两个值:可执行文件和参数,但看起来参数被忽略了,因为调用 backupDatabase 后的输出是:

用法:mysqldump [OPTIONS] database [tables] OR ...更多选项,se mysqldump --help

怎么了?我知道我可以使用Pipes(我目前不知道如何使用,只知道它们存在并且是替代品),但是由于这看起来是一个非常简单的任务,我想subprocess.call应该就足够了。那么,是否有可能解决这个问题subprocess.call?(如果没有,请提供一些帮助Pipes或任何其他解决方案)。

另外,我将MySQLdb包用于其他目的,所以如果可以使用这个包以某种方式备份和恢复,那就太好了。

4

2 回答 2

2

首先,subprocess.call期望您分别传递每个命令行参数,如下所示:

subprocess.call(['mysqldump', '-u', 'myUsername'])

其次,要重定向输出,您需要传递额外的stdout参数,其中可以是打开的文件对象:

with open('myDatabaseBackup.sql', 'w') as fout:
    subprocess.call(['mysqldump', '-u', 'myUsername'], stdout=fout)

(对于您自然使用的第二次重定向stdin。更多详细信息在常见问题解答中)

于 2013-01-30T09:21:58.787 回答
1

重定向运算符<>由 shell 处理。如果没有外壳,它们将无法工作。

尝试传递shell=Truecall()

call(['mysqldump', '-u myUsername myDatabase > myDatabaseBackup.sql'], shell=True)
call(['mysql', '-u myUsername myDatabase < myDatabaseBackup.sql'], shell=True)
于 2013-01-30T09:20:06.613 回答