【问题标题】:How to prevent subprocess to add spaces between some parameters?如何防止子进程在某些参数之间添加空格?
【发布时间】:2013-03-21 17:33:02
【问题描述】:

我想使用 Python 及其 subprocess 模块从 Linux 执行一些 Mysql 命令。

没有 Python,在 shell 中,我的命令行是:

mysql --database=mydb --host=localhost --port=3306 --password=  --execute="select * from mytable" --batch

使用 Python,我有:

cmd = ['mysql']
cmd.extend(['--database=', self._database])
cmd.extend(['--password=', self._password])
cmd.extend(['--execute=', query])

(...)

p = subprocess.Popen(cmd, shell = False, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
out, err = p.communicate()
errcode = p.returncode

不幸的是,它不起作用(mysql 只是打印使用)并且我认为,子进程生成这种输出(' '.join(cmd)):

mysql --database= mydb --host= localhost --port= 3306 --password=  --execute= "select * from mytable" --batch

即。每个参数之间添加空格,分隔= 和值。

当我在每个参数 (cmd.extend(['--password', self._password])) 中删除 = 时,它可以正常工作,除非参数为 void(因此,我测试每个参数是否为 void,然后在需要时将其删除)。

最后,我通过测试 void 参数找到了一种解决方法,但为了将来参考,是否有任何我不知道的子流程提示或用法来处理这种 parameter= ?当您必须使用=时,肯定有一些应用程序,我尽量避免使用Shell=True

【问题讨论】:

    标签: python python-2.7 subprocess


    【解决方案1】:

    改成

    cmd = [
        'mysql',
        '--database=%s' % self._database,
        '--password=%s' % self._password,
        '--execute=%s' % query
    ]
    
    (...)
    
    p = subprocess.Popen(cmd, shell = False, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    out, err = p.communicate()
    errcode = p.returncode
    

    使得参数列表包含带有各自参数的开关

    【讨论】:

    • 如此简单,然而,我什至没有想到(我想我需要休假:))谢谢
    • 我喜欢,但是如何删除扩展并在我们使用它的同时执行['mysql', '--database=%s' % self._database, ...]
    【解决方案2】:

    您将每个包含= 符号的参数作为两个单独的参数传递。不要那样做,因为它们不是两个独立的参数。

    cmd.append('--database=' + self._database)
    cmd.append('--password='+ self._password)
    cmd.append('--execute=' + query)
    

    (David 建议使用[] 一次定义整个列表,而不是重复使用appendextend 调用更好。)

    【讨论】:

      猜你喜欢
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      • 2019-06-30
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多