2013-03-21 56 views
1

我想从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

回答

4

改变,要

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 

这样的参数列表中包含了各自的论点

+0

,这种方法简单,我甚至没有想到的,(我猜我需要度假:))谢谢 – Cyrille 2013-03-21 17:41:32

+0

我喜欢,但如何去除扩展,只是做'['mysql',' - 数据库=%s'%self._database,...]'而我们是在吗? – tdelaney 2013-03-21 17:41:43

1

你传递包含=标志作为两个单独的参数每个参数的开关。不要这样做,因为它们不是两个单独的论点。

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

(大卫的使用[]来定义整个列表一次,而不是重复appendextend电话的建议是更好的方式。)

相关问题