Python subprocess.call似乎忽略参数
我写了两个小函数,用Python从控制台调用 mysqldump
和 mysql
,这样我就可以创建数据库备份,然后再恢复它:
# 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
。更多细节可以在 常见问题解答 中找到)