2011-02-12 46 views
3
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,從標準輸出,stderr我只得到MySQL標準文本「Usage mysql [OPTIONS] [Database] ...」,所以我認爲我的語法是錯誤的。但事實並非如此。我在終端上測試了這行代碼,它工作正常。mysql通過子進程不起作用

python是否有問題通過子進程來執行?我只想要一個簡單的方法來執行這個小的mysql代碼。 謝謝。

+1

如果用戶名和密碼在「」或者只是格式化的問題?並且query.sql在哪裏?它在路上嗎?試試`ls`來確定。可能在-u和用戶名(和密碼) – extraneon 2011-02-12 10:56:06

+0

之間應該有空格,是的,用戶名和密碼應該在「」中。 query.sql與python腳本位於相同的目錄中。 -u和用戶名(和密碼)之間的空格是否重要?我會測試 – SandyBr 2011-02-12 10:59:04

回答

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

這不是使用Popen的方式。程序必須是列表中的第一個元素,並且每個應該傳遞的參數也必須是列表中的一個元素。所以它應該是cmdline = ["mysql", "-u", username, "-p", password]。此外,這不是shell,所以你不能簡單地使用「< query.sql」。相反,使用stdin = PIPE參數,然後傳遞SQL查詢,如p.communicate(sqlQuery)

retcode = p.wait() 

你已經等候過程中使用.communicate()結束,所以你應該用p.returncode屬性訪問返回值。

2

這不是一個直接的答案,但如果你想從Python中調用的MySQL它通常會更容易,更可控通過DBAPI庫see python wiki來電或進一步打算爲ORM像SQLAlchemy

一個例子調用mySQL是here

相關問題