通过子进程的mysql不起作用

时间:2011-02-12 10:52:50

标签: python mysql subprocess

import os
import subprocess
cmdline = ['mysql -u"username" -p"password" < query.sql']
p = subprocess.Popen(cmdline,stdout=subprocess.PIPE)
stdout,stderr = p.communicate()
retcode = p.wait()

这是我连接mysql并执行query.sql的代码。对我来说很好看,但它不起作用,坏的是我根本没有得到任何错误信息。 retcode是1,从stdout,stderr我只得到mysql标准文本“用法mysql [OPTIONS] [数据库] ...”所以我认为我的语法错了。但事实并非如此。我测试了终端中的代码行,它可以工作。

python是否有问题通过子进程执行?我只想要一个简单的方法来执行这个小的mysql代码。 感谢。

2 个答案:

答案 0 :(得分:6)

cmdline = ['mysql -u"username" -p"password" < query.sql']

这不是使用Popen的方式。程序必须是列表的第一个元素,并且应该传递的每个参数也必须是列表的元素。所以它应该是cmdline = ["mysql", "-u", username, "-p", password]。此外,这不是shell,因此您不能简单地使用“&lt; query.sql”。而是使用stdin = PIPE参数,然后传递SQL查询,如p.communicate(sqlQuery)

retcode = p.wait()

您已经等待使用.communicate()结束流程,因此您应该使用p.returncode属性访问返回值。

答案 1 :(得分:2)

这不是一个直接的答案,但是如果你试图从python调用MySQL,那么通过DBAPI库see python wiki或者像SQLAlchemy这样的ORM进一步调用通常会更容易和更可控。 / p>

调用mySQL的示例是here