2012-12-26 6 views
0

그래서 순수 파이썬 mysql 클라이언트 구현 인 pymysql을 사용하는 애플리케이션이 있습니다. 내 대답에 들어가기 전에, 나는 다른 mysql 드라이버를 사용할 수 없다는 사실을 강조하고 싶다.한 가져 오기에서 모듈을 볼 수 있고 다른 모듈에서 보이지 않게하려면 어떻게 할 수 있습니까?

저는 MySQL이 지원하는 데이터 구조를 구현하는 모듈을 가지고 있습니다. 모듈의 요지는 다음과 같습니다.

import pymysql 
class Whatever: 
    def __init__(self): 
     # Debug statement 
     print dir(pymysql) 
     # use the cursors submodule 
     self.conn = pymysql.connect(... , cursorclass=pymysql.cursors.DictCursor) 

이 파일을 내 테스트 파일로 가져 오면 모든 것이 정상입니다. 다음은 print 문장의 출력입니다.

Traceback (most recent call last): 
    File "xxx.py", line 72, in <module> 
    passwd='', db='test_db') 
    File "yyy.py", line 26, in __init__ 
    passwd=passwd, db=db, cursorclass=pymysql.cursors.DictCursor) 
AttributeError: 'module' object has no attribute 'cursors' 

이 다음에 dir 인쇄의 출력이 될 때 :

['BINARY', 'Binary', 'Connect', 'Connection', 'DATE', 'DATETIME', 'DBAPISet', 'DataError', 
'DatabaseError', 'Date', 'DateFromTicks', 'Error', 'FIELD_TYPE', 'IntegrityError', 
'InterfaceError', 'InternalError', 'MySQLError', 'NULL', 'NUMBER', 'NotSupportedError', 
'OperationalError', 'ProgrammingError', 'ROWID', 'STRING', 'TIME', 'TIMESTAMP', 'Time', 
'TimeFromTicks', 'Timestamp', 'TimestampFromTicks', 'VERSION', 'Warning', '__all__', 
'__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 
'__version__', 'apilevel', 'charset', 'connect', 'connections', 'constants', 'converters', 
'cursors', 'err', 'escape_dict', 'escape_sequence', 'escape_string', 'get_client_info', 
'install_as_MySQLdb', 'paramstyle', 'sys', 'thread_safe', 'threadsafety', 'times', 'util', 
'version_info'] 

내 주요 파일에서 모듈을 가져, 내가 AttributeError 얻을 : 특히, 나는 커서 모듈에 주목 :

['BINARY', 'Binary', 'Connect', 'Connection', 'DATE', 'DATETIME', 'DBAPISet', 
'DataError', 'DatabaseError', 'Date', 'DateFromTicks', 'Error', 'FIELD_TYPE', 
'IntegrityError', 'InterfaceError', 'InternalError', 'MySQLError', 'NULL', 'NUMBER', 
'NotSupportedError', 'OperationalError', 'ProgrammingError', 'ROWID', 'STRING', 'TIME', 
'TIMESTAMP', 'Time', 'TimeFromTicks', 'Timestamp', 'TimestampFromTicks', 'VERSION', 
'Warning', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 
'__path__', '__version__', 'apilevel', 'charset', 'connect', 'constants', 'converters', 
'err', 'escape_dict', 'escape_sequence', 'escape_string', 'get_client_info', 
'install_as_MySQLdb', 'paramstyle', 'sys', 'thread_safe', 'threadsafety', 'times', 
'version_info'] 

특히, cursors은 없다. pymysql.__file__을 선택하면 두 경우 모두 동일하며, 출력은 다음과 같습니다

__init__.py  charset.py connections.py constants converters.pyc cursors.pyc err.pyc  times.py util.py 
__init__.pyc charset.pyc connections.pyc converters.py cursors.py err.py  tests  times.pyc util.pyc 

이 분명히 cursors.py있다. 그래서 무엇을 제공합니까?

+0

코드는 실제로 어떻게 생겼습니까? 순환 수입 문제 일 수 있습니다. –

답변

2

파일 상단에 import pymysql.cursors 명시 적으로 추가해야합니다.

cursors 하위 패키지는 pymysql__all__에 나열되지 않으므로 import pymysql 일 때만 가져올 수 있습니다.

+0

예, 적어도 pymysql의 github에 따르면. https://github.com/petehunt/PyMySQL/blob/master/pymysql/__init__.py 하단을보십시오. –

+0

사실 그것은'__all__'에서 언급되었지만 실제로 하위 패키지를 네임 스페이스로 가져 오지 않으므로 실제로 특성으로 내보내지지 않습니다. – Wessie

+0

'pymysql 가져 오기 '가 자동으로'pymysql.cursors'를 가져 오지 않는다는 것을 확인할 수 있습니다. 내가 펀치에 맞았을 때 같은 대답을 쓰고 있었는데, 나는 이것을 대신에 upvoted했다. – DSM