2012-04-30 1 views
0

나는 프로젝트 참조 목록에 서로를 가지고있는 PyDev에 3 개의 프로젝트를 설정했습니다. 다시 예를 위해서레터스와 함께 지뢰를 반입

proj_f 
    pack_foo 
     mod_fooa (contains class Fooa) 
     mod_foob (contains class Foob) 
    mod_faa (contains class Faa) 
    pack_fii 
     mod_fiia (contains class Fiia) 
     mod_fiib (contains class Fiib) 
proj_b 
    mod_bar (contains function func_bar) 
    pack_baz 
     mod_baza (contains class Baza) 
     mod_bazb (contains class Bazb) 
proj_t 
    tester (what I'm running from) 

, 테스터 :

from pack_foo.mod_fooa import Fooa 
from pack_fii.mod_fiia import Fiia 
from mod_bar import func_bar 
func_bar(Fooa(), Fiia()) 

및 mod_bar : 설명을 위해

from pack_foo.mod_fooa import Fooa 
from pack_fii.mod_fiia import Fiia 
def func_bar(fooa, fiia): 
    if not fooa: 
     fooa = Fooa() 
    if not fiia: 
     fiia = Fiia() 
    fooa.do_magic() 
    fiia.do_magic() 

내가보고 있어요 foo는 일부 수입 ImportError: cannot import name을 얻을 것입니다 mod_bar에서 테스터로부터 호출 할 때 (결정적으로, 일부는 아니지만 모두). mod_bar 만 실행하면 가져 오기가 제대로 작동합니다. mod_bar에서 종속성 및 가져 오기를 제거하고 테스터에서 실행할 경우 제대로 작동합니다. 클래스의 하위 집합을 f에서 b와 t로 가져오고 t에서 실행할 경우에만 중단됩니다. 나는 임포트가 어떻게 작동하고 솔루션을 찾기 위해 문서를 읽으려고 노력했지만 올바른 방향으로 나를 가리키는 것을 발견하지 못했다. 이 부분이 파이썬 내부의 애매한 부분과 관련이 있다는 느낌이 들지만, 그것이 무엇인지 알기에는 충분하지 않습니다.

나는이 정확하게 mod_bartester에서 참조가 간접적 인 것을 포함 복잡성의 추가 층 (I가 작업 할 tester 내가 내 코드 주변에 원숭이에 사용하는 파일입니다 존재하지만, 무슨 일이 일어나고 있는지 나타냅니다 생각 그 중 mod_bar은 실제로 레터스 지형 파일이며, 레터스는 tester이 호출하는 다른 모듈에 의해로드됩니다. 누군가가이 문제를 해결하는 방법에 대한 정보를 찾기 시작할 수있는 장소를 적어도 제공 할 수 있습니까?

편집 :

내가이 좀 더 구체적으로 스택 추적을보고했다 :

Traceback (most recent call last): 
    File "C:\Python27\Lib\site-packages\lettuce\__init__.py", line 53, in <module> 
    terrain = fs.FileSystem._import("terrain") 
    File "C:\Python27\Lib\site-packages\lettuce\fs.py", line 74, in _import 
    module = imp.load_module(name, fp, pathname, description) 
    File "C:\Users\adminsetup\workspace\nytd_lettuce_lib\terrain.py", line 6, in <module> 
    from session.session import Session 
    ImportError: cannot import name Session 

lettuce.__init__()에서 terrain = fs.FileSystem._import("terrain") 나에게 이러한 두통을주는 원인이 원형 수입 될 수 있을까?

답변

0

그래서 예, 순환 가져 오기가 발생했습니다. 문제는 여러분이 import lettuce 일 때 lettuce.py가 실행되고 어떤 것이 동적으로 terrain을 가져 오는 것입니다. 저와 무슨 일이 일어 났는지

내가 차례 수입에 LoggerManager이 world에 대기열에 로그 메시지를 밀어, 따라서 logger_manager world에 액세스 할 수 import lettuce을하는 logging.Handler 서브 클래스를 포함 AbstractSession를 가져 오는 세션 클래스를 가지고 있었다. Session 객체를 위로 회전하여 모든 테스트를 시작하기를 원했기 때문에 각 테스트 전에 Session을 시작하기 위해 지형에 @beforeeach 메서드가 있습니다. 이는 Session을 지형에 가져 오는 것을 의미합니다.

물론 이것은 어느 파일에서든 세션을 가져올 때마다 session.session.Session이 시간별로 초기화되지 않은 상태의 전체 이벤트 체인 (Session> AbstractSession> lettuce> terrain> Session)을 트리거한다는 것을 의미합니다. 지형은 그것을로드하려고 시도합니다.

제 생각에는 가장 좋은 해결 방법은 지형에 월드와 관련된 로그 처리기와 로그 캐시를 붙이는 것이고 지형에는 처리기 자체를 첨부하는 것입니다. 다행스럽게도 로깅은 전역 액세스이므로이 옵션이 좋습니다. 이것은 실제로 상추에 대해 이야기하는 코어 라이브러리에 코드가 없으므로 필자의 프레임 워크의 구획화를 향상시킵니다. 그 모든 것은 상추 lib에 있습니다. 그래도 양상추에 내장 된 지뢰가 없는게 좋을거야.

tl; dr, 정말 기본적인 테스트 스위트 이상을 시도하려는 경우 상추를 피하십시오.

관련 문제