2013-05-23 5 views
0

그래서 저는 팀/플러그인 전체를 팀에 밀어 넣을 수있는 방법을 개발하고 있습니다. 나는 실제로 시스템을 가동시키고 있으며, 내가 말하는 주제를 제외하고는 완전히 동적이다 (이것은 모두 파이썬으로 이루어진다). 시작시 Maya는 로컬 폴더를 서버의 폴더와 비교하여 다른 폴더인지 확인하고 필요한 파일/디렉토리를 처리 및 복사하며 서버에서 삭제 한 이전 플러그인을 삭제합니다. 이 시스템은 사용자가 모든 플러그인의 맞춤 서가를 만들 수있을만큼 유연하며 모든 사용자의 서가를 깨뜨리지 않고 백엔드에서 폴더를 구성 할 수 있습니다. 플러그인은 Maya의 메인 인터페이스의 드롭 다운 메뉴를 통해 액세스 할 수 있으며 코드를 망치지 않고 자유롭게 시스템과 플러그인에 하위 폴더를 추가 할 수 있습니다. 폴더의 간단한 번호 매기기 시스템을 통해 메뉴 항목과 플러그인을 표시 할 수있는 순서를 정할 수도 있습니다.Python에서 모듈/스크립트 가져 오기

동적으로 폴더의 모듈을 가져올 때까지 플러그 인을 만들 때까지이 모든 작업이 정상적으로 작동합니다. 그래서 내가 루트 디렉토리 주위에 플러그인 폴더를 움직이기 시작했을 때, 내가 경로를 생성 한 가져온 모듈을 가지고 있다면, 플러그인 스크립트에서 가져온 모듈 경로가 그 시점에서 잘못되었습니다. 이미 메뉴 설정을 통해 플러그인에 적절한 경로 정보를 얻는 방법이 있습니다. 모듈 가져 오기 및 해당 모듈에서 클래스 액세스에 문제가 있습니다.

그렇다면 모듈의 클래스

from fileName import className 

와 내가 좋아하는 외모를 사용하고있어 __import__ 방법을 가져 오기위한 표준.

className = __import__("folderN.folderN.folderN.fileName", {}, {}, ["className"]) 

그러나 내가 가져 오기 방법에서 일반 때와 수처럼 그냥 클래스 이름을 호출하는 기능을 잃게하는 방법

. 나는

className = className.className 

을 수행하여 그 주위를 가지고 있지만, 이것은 오히려 추한 방법이며 난 그냥 가져가 추가 단계를 수행하지 않고 이름을 호출 할 수 있기를 원합니다. 나는이 수입 방법을 잘 모른다. 그리고 내가 그걸로 몇 가지를 놓치고 있다는 것을 안다.

나는이 가져 오기 프로세스를 잘못된 방식으로 진행하고 있습니까? Maya의 경로를 추가하지 않고 플러그인의 로컬 디렉토리를 볼 수있는 방법이 있나요? 플러그인을 이동할 때마다 변경해야하는 이상한 경로가없는 메소드를 가져 오는 일반적인 방법을 사용할 수 있습니까?

답변

0

__import__ 당신이 추측하는 방식대로 작동하지 않습니다. 제공된 가져 오기 경로에 대한 모듈 객체를 반환하며, 목록에 지정한 모든 자식이 명시 적으로 가져 왔음을 보장합니다. 클래스의 경우에는 실제로 차이가 없습니다.

mod = __import__('a.b', {}, {}, ['c', 'd']) 

은 당신이를 사용하여 살펴 보았다, 당신이 실제로 아마 여기에 원하는 것은

당신의 버전 관리 및 분배 시스템에 관해서는
child = getattr(__import__(import_path, {}, {}, [child_name]), child_name) 

같은 더 정확하게

import a.b 
try: 
    import a.b.c 
except ImportError: 
    pass 
try: 
    import a.b.d 
except ImportError: 
    pass 
mod = a.b 

의 동일 SVN 또는 GIT와 같은 SCM/VCS 및/또는 패키지 관리 시스템? 이러한 기능을 통해 직선적 인 파일 공유보다 더 나은 변경 추적 및 동기화가 가능하며 클라이언트의 특정 구성 요구 사항에 맞게 필요에 따라 사용자 정의 할 수있는 클라이언트 시스템의 동기화/설치 스크립트와 쉽게 통합 할 수 있습니다.

+0

와우 감사합니다!매력처럼 작동하지만 가져 오기 대신 명세서로 가져 오기를 수행하는 경우 어떻게됩니까? 지금 당장 나는 코드에서 코드를 호출 할 수 있도록 className = className.className을 수행하는 코드의 추악한 블록을 수행해야한다. – jredd

+0

'import x as y'는 가져 오기 네임 스페이스에서'y' 레이블로 작업을 가져옵니다. 가져 오기 네임 스페이스에서 동적 레이블 할당을 지원해야하는 경우'globals()'또는'locals()'를 업데이트 할 수 있지만 실제로 배포 요구를보다 잘 지원할 수 있도록 코드 기반을 재구성해야합니다. 동적 가져 오기 경로를 지원하기 위해 가져 오기 시스템을 해킹하려고합니다. –