我想使用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参数,但为了将来参考,是否有任何子进程提示或用法我不知道处理这种parameter=
?当必须使用=
时,必须有一些应用程序,我会尽量避免使用Shell=True
。
答案 0 :(得分: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
这样参数列表包含带有各自参数的开关
答案 1 :(得分:1)
您将包含=
符号的每个参数作为两个单独的参数传递。不要这样做,因为它们不是两个单独的论点。
cmd.append('--database=' + self._database)
cmd.append('--password='+ self._password)
cmd.append('--execute=' + query)
(David建议使用[]
一次定义整个列表,而不是重复append
或extend
次调用。“