【问题标题】:Python subprocess.call seems to ignore parametersPython subprocess.call 似乎忽略了参数
【发布时间】:2013-01-30 09:13:31
【问题描述】:

我已经用 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 包用于其他目的,所以如果可以使用此包以某种方式备份和恢复,那就太好了。

【问题讨论】:

  • 一些猜测:1) 你必须拆分参数,否则它们最终会被引用。 “-u”、“我的用户名”、“我的数据库”。 2) 是默认不解释的 shell 语法。尝试使用 shell=True。 (并相应地拆分,因此它不会被解释为单个参数)。

标签: python mysql-python


【解决方案1】:

首先,subprocess.call 期望你分别传递每个命令行参数,像这样:

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

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

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

(对于第二次重定向,你自然会使用stdin。更多细节在FAQ

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2021-10-28
      • 2016-09-30
      • 2016-03-16
      相关资源
      最近更新 更多