2

我想使用 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

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

当我删除=每个参数cmd.extend(['--password', self._password])

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

4

2 回答 2

6

将其更改为

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

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

于 2013-03-21T17:38:22.520 回答
1

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

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

(大卫建议使用[]一次定义整个列表而不是重复appendextend调用是更好的风格。)

于 2013-03-21T17:40:00.973 回答