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代码。 感谢。
答案 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