2013-04-27 7 views
3

사용자가 추가하고 가져 오기 기능을 사용하여 주 프로그램 (foo.py)으로 가져올 수있는 모듈 (.py 파이썬 파일)을 관리하고 실행하는 Python 프로그램을 개발 중입니다. 여기에 내가Python - 상대적 가져 오기

from src.output import * 

하지만이 직면하고있는 문제를 사용하여 foo.py에서 가져올 수 있습니다

Foo/ 
    foo.py #Main script. Imports ouput.py, core.py and bar.py when needed. 
    src/ 
     __init__.py 
     output.py #Output functions required by bar.py and foo.py 
     core.py 
    modules/ 
     __init__.py 
     bar.py #Needs output.py 

디렉토리 구조입니다 그 나는

를 사용하여 bar.py에서 output.py 가져올 때
from ..src.output import * 

나는 오류를 얻을

ValueError: Attempted relative import beyond toplevel package 

다른 프로그래머가 별도로 코드를 작성하는 것이 더 쉽기 때문에 다른 디렉토리에 파일을 넣고 있습니다. 'modules'또는 .py 모듈 파일을 추가 할 수있는 폴더가 필요하고 bar.py에 그 기능이 사용됩니다.

그리고 내가 잘못했는지 말해주십시오. 그리고 그것을 할 수있는 더 좋은 방법을 제안하십시오.

감사합니다.

+0

수입은 모두 최상위 수준입니다. src.output은 Foo/src/output을 찾습니다. ..src.output은 프로젝트 외부로 가져올 수 없으므로 라이브러리가 손상되는 시점에서 Foo를 초과하여 시도합니다. 원하는 모듈을 다른 디렉토리 구조에 추가하거나 클래스 경로를 변경해야합니다. –

+0

아아, 내가 foo.bar ..에서 가져올 때 필요하지 않습니다. 감사. 그러나 이것을 할 수있는 더 좋은 방법이 있습니까? –

답변

4

Foo에는 __init__.py이 없으므로 문제는 패키지로 간주되지 않습니다.

상대 가져 오기에서 각 기간은 패키지를 나타냅니다. 당신이 bar.py에서

from ..src.output import * 

을 수행 할 때, 첫 번째 기간은 현재 패키지, modules을 의미합니다. 두 번째 기간은 위의 패키지 Foo을 나타냅니다. Foo은 실제로 패키지가 아니기 때문에 오류가 발생합니다.

P. 와일드 카드 가져 오기가 싫증납니다. 특히 이처럼 먼 거리에서 관련된 패키지에서 가져올 때, 나는 그것을 명시적인 수입으로 리팩토링하려고 노력할 것이다.

+0

고맙습니다. 그러나 명시 적 수입에 대해 좀 더 분명히 알 수 있습니까? 어쩌면 모범을 보일 수 있습니까? –

+0

@GrimReaper 명시 적 가져 오기는'import *'를 사용해서는 안되며'from mymodule import myfunc, myclass'와 같이 가져 오는 내용을 명시 적으로 말합니다. –

+0

감사합니다. 내 디렉토리 구조를 수정해야합니까? –