2015-01-29 9 views
1

처음에는 여기에 이미 많은 질문이 있습니다. (ThisThis이 가장 비슷합니다.) 나는 그 중 몇 가지를 읽었지 만, 이것을 달성하기위한 적절한 방법에 대해 여전히 혼란스러워하고있다.모듈 내의 다른 디렉토리/상위 디렉토리 (Python 3)에서 가져 오는 방법에 대해 혼동스럽게 생각합니다.

--LabAnalysisModules 
    |-- __init__.py 
    |-- EphysTools 
     |-- __init__.py 
     |-- synaptics.py 
     |-- utilities.py 
    |-- PrairieAnalysis 
     |-- pv_import.py 
     |-- pxml_parse.py 

--PVAnalysis 
    |-- __init__.py 
    |-- MainWindow.py 
    |-- DataViewer.py 
    |-- AnalysisWindows 
     |-- __init__.py 
     |-- AnalysisWidget.py 

AnalysisWidget는 DataViewer에서 DataViewer 클래스에서 상속 :

나는 내가 그 일하고 있어요 프로젝트 이런 식으로 구성되어 있습니다. DataViewer를 가져 오기 위해 두 가지 혼란이있었습니다.

  1. 실제로 DataViewer를 가져 오는 가장 적합한 방법은 무엇입니까? 상대 가져 오기가 나에게 DataViewer I가이 내 기계 LabAnalysisModules 중 일부는 영구적으로 파이썬 경로에 추가되었습니다에 (except 블록 ... 시도하고 내 SystemError: Parent module '' not loaded, cannot perform relative import

  2. 을 제공하기 때문에 나는 현재 AnalysisWidget에서 sys.path.append(os.path.abspath("../../PVAnalysis"))을 포함에 의존하고있다 다른 사람이)되지 않은 DataViewer 자체가 잘 작동 실행

    try: 
        import PrairieAnalysis.pv_import as pvi 
        import EphysTools.utilities as util 
    except ImportError: 
        import os 
        sys.path.append(os.path.abspath('../LabAnalysisModules')) 
        import PrairieAnalysis.pv_import as pvi 
        import EphysTools.utilities as util 
    

,하지만 난 AnalysisWidget에서 다른 가져 오기 오류 import DataViewer으로 실행

,

except 블록에 print(sys.path) 추가,이 DataViewer을 가져올 때의 sys.path에 추가되는 것입니다 :

E:\\Users\\Dan\\SkyDrive\\Documents\\Python\\PVAnalysis\\LabAnalysisModules' 

분명히 정확하지된다.

나는 AnalysisWidget에서 sys.path.append('../../LabAnalysisModules')를 포함하여 가져 오기 오류를 해결할 수 있지만, 이것은 매우 미봉책 수정 내가 코멘트에서 말하는 것처럼

편집 한

, 궁극적으로 AnalysisWidget은 MainWindow를 가져올 수 것 같아 . 다시 말하면, 상대적 수입이 어떻게 작동하는지에 대해서는 분명하지 않습니다. 방법 : 하루의 끝에서

from .. import DataViewer 
ValueError: attempted relative import beyond top-level package 

을, 내가 할 노력하고있어 두 가지가 있습니다 :

  1. 단순히 AnalysisWidget.py를 실행할 수 있습니다 (I 일반적으로 당신은 때로 믿을 것을 알고있다 모듈 내에서 스크립트를 실행해야하지만, GUI를 만들 때는 언제나이 작업을 수행합니다.

  2. AnalysisWidget을 MainWindow로 가져올 수 있어야합니다.

LabAnalysisModules에 대한 가져 오기 작업도 정리하면 좋습니다.패키지 수입은 파이썬 3에서 제대로 작동하기 위해서는

+0

어떻게 'AnalysisWidget'을 호출합니까? 직접적으로 또는'-m' 스위치를 사용하여 파이썬으로 전환 할 수 있습니까? – Kevin

+0

위에서보고 된 SystemError는 파이썬 셸 내에서 AnalysisWidget을 가져 오는 중입니다. 나는 -m 스위치를 사용해 보았지만, 스펙을 찾는 중에 Error를 얻었을 때 뭔가 제대로하고있는 것처럼 보이지 않는다. – user3014097

+0

궁극적으로, AnalysisWidget은 MainWindow에 의해 반입 될 것이다. – user3014097

답변

1

, 당신의 작업 디렉토리는 LabAnalysisModulesPVAnalysis의 부모해야합니다 (또는 디렉토리 sys.path에 나타나야합니다 말했지만, 작업 디렉토리가 그렇게 할 수있는 가장 쉬운 방법입니다 그것을 만들기) . 당신의 모듈 중 하나가 실행 가능한 경우 또한, 그들은 다음과 같은 구문으로 호출해야합니다

python -m 'PVAnalysis.AnalysisWindows.AnalysisWidget' 

자세한 내용은 PEP 328를 참조하십시오.

+0

PEP 328을 통해 읽는 중 AnalysisWidget.py에서 'from .. DataViewer import DataViewer'가 작동하지 않는 이유를 아직도 이해할 수 없습니다. 이것은 MainWindow.py에서'import AnalysisWindows.AnalysisWidget'을 호출하는 것입니다. 필자는 PEP – user3014097

+0

에서'from ..moduleA import foo' 예제와 동일하게 보입니다. 최상위 패키지 경계를 넘기 때문입니다. 별도의 최상위 패키지에서 항목을 가져 오려면 절대 가져 오기를 사용해야합니다. – Kevin

+0

미안하지만, 아직도 당신이 의미하는 것을 이해하지 못합니다. 내가 제시 한 파일/패키지 구조가 PEP의 파일/패키지 구조와 어떻게 다른지, 내가하고있는 일이 무효하다는 것입니다. (이것에 대해 저에게 감사드립니다.) – user3014097