현재 스크립트 위의 레벨에서 디렉토리에서 모듈을 가져 오는 방법
문제
파이썬 응용 프로그램의 경우 다음 디렉토리 구조가 있습니다.
\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.py
에 myapp\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)를 사용하십시오.