현재 스크립트 위의 레벨에서 디렉토리에서 모듈을 가져 오는 방법

StackOverflow https://stackoverflow.com/questions/1003843

  •  05-07-2019
  •  | 
  •  

문제

파이썬 응용 프로그램의 경우 다음 디렉토리 구조가 있습니다.

\myapp
\myapp\utils\
\myapp\utils\GChartWrapper\
\myapp\model\
\myapp\view\
\myapp\controller\

myapp view 의 내 클래스 중 하나 GCHARTWRAPPER. 그러나 가져 오기 오류가 발생합니다 ...

myview.py
from myapp.utils.GChartWrapper import *

오류는 다음과 같습니다.

<type 'exceptions.ImportError'>: No module named GChartWrapper.GChart
      args = ('No module named GChartWrapper.GChart',)
      message = 'No module named GChartWrapper.GChart' 

내가 뭘 잘못하고 있죠? 파이썬에서 모듈/클래스를 가져 오기가 정말 어려운 시간이 있습니다 ...

도움이 되었습니까?

해결책

그만큼 __init__.py 파일 GchartWrapper 패키지 중 PythonPath의 GchartWrapper 패키지가 기대됩니다. 첫 번째 줄로 말할 수 있습니다.

from GChartWrapper.GChart import *

패키지 디렉토리 구조에 GchartWrapper가 포함 된 패키지가 필요합니까? 그렇다면, 당신이 할 수있는 한 가지는 패키지가 런 타임에 sys.path에있는 경로를 추가하는 것입니다. 나는 그것을 취한다 myview.pymyapp\view 예배 규칙서? 그런 다음 가져 오기 전에이 작업을 수행 할 수 있습니다 GChartWrapper:

import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'utils')))

디렉토리 구조에 필요하지 않은 경우 기존 위치에 설치하는 것이 더 쉬울 수 있습니다. GchartWrapper 소스 배포에 포함 된 setup.py 스크립트를 실행하여이를 수행 할 수 있습니다.

다른 팁

Arbriticy Paths에서 모듈과 패키지를 가져 오지 않습니다. 대신, 파이썬에서는 패키지와 절대 가져 오기를 사용합니다. 그것은 모든 미래의 문제를 피할 것입니다.

예시:

다음 파일을 만듭니다.

MyApp\myapp\__init__.py
MyApp\myapp\utils\__init__.py
MyApp\myapp\utils\charts.py
MyApp\myapp\model\__init__.py
MyApp\myapp\view\__init__.py
MyApp\myapp\controller\__init__.py
MyApp\run.py
MyApp\setup.py
MyApp\README

파일은 다음을 제외하고는 비어 있어야합니다.

MyApp\myapp\utils\charts.py:

class GChartWrapper(object):
    def __init__(self):
        print "DEBUG: An instance of GChartWrapper is being created!"

MyApp\myapp\view\__init__.py:

from myapp.utils.charts import GChartWrapper

def start():
    c = GChartWrapper() # creating instance of the class

MyApp\run.py:

from myapp.view import start
start()

그게 다야! 진입 점을 실행할 때 (run.py)보기에서 함수를 호출하고 GchartWrapper 클래스의 인스턴스를 만듭니다. 이 구조를 사용하면 어디서나 가져 와서 사용할 수 있습니다.

보완하기 위해 MyApp\setup.py MyApp MyApp 패키지에 대한 설치 프로그램을 작성합니다. 사용 distutils 그것을 쓰려면 :

from distutils.core import setup
setup(name='MyApp',
      version='1.0',
      description='My Beautiful Application',
      author='Martin',
      author_email='martin@xxxxxxx.com',
      url='http://stackoverflow.com/questions/1003843/',
      packages=['myapp'],
      scripts=['run.py']
     )

충분합니다. 이제 사람들이 myapp 폴더를 다운로드하면 setup.py를 사용하여 설치하고 run.py를 사용하여 실행할 수 있습니다. Distutils는 Windows 설치 가능 .exe를 포함하여 여러 형식으로 패키지를 생성 할 수 있습니다.

파이썬 패키지/응용 프로그램을 배포하는 표준 방법입니다.

Python이 파일을 찾는 경로를 변경할 수 있습니다.

소스 파일 상단에서 다음을 추가합니다.

import sys
sys.path.append("..") 

또는 환경 변수를 대안으로 변경합니다.

export PYTHONPATH=..

또는 Python 2.5에서 시작합니다 (MyView가 MyApp view에 있다고 가정합니다.

from __future__ import absolute_import
from ..utils.GChartWrapper import *

보다: http://docs.python.org/whatsnew/2.5.html#pep-328-absolute-and-relative-imports

GCHARTWRAPPER는 PYPI에서도 제공되므로 Easy_Install 또는 PIP를 사용하여 모듈을 설치할 수 있습니다.

sudo pip install GChartWrapper==0.9

그런 다음 PythonPath에 자동으로 추가 된 다음 /MyApp /Utils 디렉토리에서 제거 할 수 있습니다. sudo를 사용할 수 없다면 virtualenv (및 virtualenvwrapper)를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top