Python subprocess.call似乎忽略参数

1 投票
2 回答
1281 浏览
提问于 2025-04-17 14:10

我写了两个小函数,用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 [选项] 数据库 [表] 或者 ... 想要更多选项,请查看 mysqldump --help

这是什么情况呢?我知道我可以使用 Pipes(我现在不知道怎么用,只知道它们存在并且是另一种选择),但这看起来是个很简单的任务,我觉得 subprocess.call 应该就够了。那么,能不能用 subprocess.call 来解决这个问题呢?(如果不行,请提供一些关于 Pipes 或其他解决方案的帮助)。

另外,我还在用 MySQLdb 包做其他事情,所以如果能用这个包来备份和恢复,那就太好了。

2 个回答

1

重定向操作符 <> 是由命令行的外壳程序处理的。如果没有外壳程序,这些操作符就无法使用。

试着在调用 call() 时加上 shell=True

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

首先,subprocess.call 这个函数要求你把每个命令行参数单独传递,像这样:

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

其次,如果你想把输出重定向到其他地方,就需要传递一个额外的 stdout 参数,这个参数可以是一个打开的文件对象:

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

(对于第二个重定向,你自然会使用 stdin。更多细节可以在 常见问题解答 中找到)

撰写回答