2011-02-12 4 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이고 stdout에서 stderr를 사용하는 경우 mysql 표준 텍스트 "Usage mysql [OPTIONS] [Database] ..."만 표시되므로 구문이 잘못되었다고 생각합니다. 그러나 그렇지 않습니다. 터미널에서 코드 줄을 테스트 한 결과 작동합니다.서브 프로세스를 통한 mysql이 작동하지 않습니다.

파이썬은 서브 프로세스를 통해 이것을 실행하는 데 문제가 있습니까? 난이 작은 mysql 코드를 실행하는 쉬운 방법이 필요하다. 감사합니다. .

+1

사용자 이름과 암호를 ""입력해야합니까, 아니면 질문의 서식을 지정해야합니까? 그리고 query.sql은 어디에 있습니까? 그것은 길 위에 있습니까? 'ls'을 시도해보십시오. 그리고 아마도 -u와 사용자 이름 (및 암호) 사이에 공백이 있어야합니다. – extraneon

+0

예, 사용자 이름과 암호는 ""이어야합니다. query.sql은 python 스크립트와 같은 dir에 있습니다. -u와 사용자 이름 (및 암호) 사이의 공간이 중요합니까? 내가 테스트 할 것이다 – SandyBr

답변

6
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 속성과 반환 값에 액세스해야합니다.

+0

나는'-p'와 패스워드가 같은 arg ... ie가 아니면 내가 문제가 있었다. 'subprocess.call ([ "mysql", "-u", 사용자 이름, "-p % s"% 암호, "-e", "SELECT @@ hostname"]' – KCD

2

이 직접 대답은 아니지만 당신이 파이썬에서 MySQL을 호출하려고하는 경우는 일반적으로 DBAPI 라이브러리 see python wiki를 통해 전화를 걸거나 호출하기위한 SQLAlchemy

예제처럼 ORM으로 더가는 것이 더 쉽고 제어 될 것 mySQL은 here

관련 문제