如何防止子进程在某些参数之间添加空格



我想使用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。=与value之间用空格隔开。

当我在每个参数(cmd.extend(['--password', self._password]))中删除=时,它工作得很好,除非参数为空(因此,我测试每个参数是否为空,然后在需要时删除它)。

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

更改为

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

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

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

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

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

最新更新