我想从Linux执行一些Mysql命令,使用Python及其subprocess
模块。如何防止子进程在一些参数之间添加空格?
没有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参数,但为了将来的参考,是否有任何子进程提示或用法我不知道处理这种parameter=
?必须有一些应用程序,当你必须使用=
,我尽量避免Shell=True
。
,这种方法简单,我甚至没有想到的,(我猜我需要度假:))谢谢 – Cyrille 2013-03-21 17:41:32
我喜欢,但如何去除扩展,只是做'['mysql',' - 数据库=%s'%self._database,...]'而我们是在吗? – tdelaney 2013-03-21 17:41:43