通过子进程调用mysql无效

3 投票
2 回答
4983 浏览
提问于 2025-04-16 11:41
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的代码。看起来没问题,但它就是不工作,最糟糕的是我根本没有收到任何错误信息。返回代码是1,而从标准输出和标准错误中,我只看到mysql的标准提示信息“Usage mysql [OPTIONS] [Database] ...”,所以我以为我的语法有问题。但其实并没有。我在终端测试了这行代码,它是可以正常工作的。

难道python在通过子进程执行这个的时候有问题吗?我只是想简单地执行这段小的mysql代码。谢谢。

2 个回答

1

这不是一个直接的答案,但如果你想从Python中调用MySQL,通常使用DBAPI库会更简单、更易于控制。你可以查看一下这个Python维基,或者更进一步使用像SQLAlchemy这样的ORM工具。

关于如何调用MySQL的一个例子可以在这里找到。

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

这不是使用 Popen 的正确方法。程序名必须放在列表的第一个位置,所有要传递的参数也要作为列表的元素。所以应该写成 cmdline = ["mysql", "-u", username, "-p", password]。另外,这里不是在使用命令行,所以不能直接用 "< query.sql"。你应该使用 stdin = PIPE 这个参数,然后通过 p.communicate(sqlQuery) 来传递 SQL 查询。

retcode = p.wait()

你已经通过 .communicate() 等待进程结束了,所以你可以通过 p.returncode 属性来获取返回值。

撰写回答