Python subprocess.call似乎忽略了参数

时间:2013-01-30 09:13:32

标签: python mysql-python

我在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]数据库[tables]或...对于更多选项,   se mysqldump --help

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

另外,我正在使用MySQLdb包用于其他目的,因此如果可以使用此包进行备份和恢复,那就太棒了。

2 个答案:

答案 0 :(得分:2)

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

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

其次,要重定向输出,您需要传递额外的stdout参数,其中包括一个打开的文件对象:

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

(对于第二次重定向,您自然会使用stdin。更多详情请见FAQ

答案 1 :(得分:1)

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

尝试将shell=True传递给call()

call(['mysqldump', '-u myUsername myDatabase > myDatabaseBackup.sql'], shell=True)
call(['mysql', '-u myUsername myDatabase < myDatabaseBackup.sql'], shell=True)