[python] 상대 경로에서 모듈 가져 오기

상대 경로가 주어진 파이썬 모듈을 어떻게 가져 옵니까?

예를 들어, dirFoo포함 Foo.pydirBar, 및 dirBar포함 Bar.py, 내가 어떻게 가져 옵니까 Bar.pyFoo.py?

시각적 인 표현은 다음과 같습니다.

dirFoo\
    Foo.py
    dirBar\
        Bar.py

Foo포함 Bar하고 싶지만 폴더 계층 구조를 재구성하는 것은 옵션이 아닙니다.



답변

두 디렉토리가 모두 실제 파이썬 패키지라고 가정하면 ( __init__.py파일 안에 파일이 있음) 스크립트의 위치에 상대적으로 모듈을 포함시키는 안전한 솔루션이 있습니다.

스크립트에 모듈 세트를 포함해야하므로이 작업을 원한다고 가정합니다. 나는 이것을 여러 제품의 프로덕션에서 사용하고 다른 디렉토리에서 호출되거나 새로운 인터프리터를 여는 대신 파이썬 실행으로 실행되는 스크립트와 같은 많은 특수 시나리오에서 작동합니다.

 import os, sys, inspect
 # realpath() will make your script run, even if you symlink it :)
 cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
 if cmd_folder not in sys.path:
     sys.path.insert(0, cmd_folder)

 # Use this if you want to include modules from a subfolder
 cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],"subfolder")))
 if cmd_subfolder not in sys.path:
     sys.path.insert(0, cmd_subfolder)

 # Info:
 # cmd_folder = os.path.dirname(os.path.abspath(__file__)) # DO NOT USE __file__ !!!
 # __file__ fails if the script is called in different ways on Windows.
 # __file__ fails if someone does os.chdir() before.
 # sys.argv[0] also fails, because it doesn't not always contains the path.

또한이 방법을 사용하면 Python이 시스템에 설치된 모듈 대신 모듈을 사용하도록 할 수 있습니다.

경고! 현재 모듈이 egg파일 안에있을 때 무슨 일이 일어나고 있는지 잘 모르겠습니다 . 아마도 실패 할 것입니다.


답변

dirBar에 __init__.py파일이 있는지 확인하십시오. 그러면 디렉토리가 Python 패키지로 만들어집니다.


답변

하위 디렉토리를 Python 경로에 추가하여 일반 스크립트로 가져올 수 있습니다.

import sys
sys.path.insert(0, <path to dirFoo>)
import Bar


답변

import os
import sys
lib_path = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'lib'))
sys.path.append(lib_path)

import mymodule


답변

다른 폴더에서 .py 파일을 가져 오는 간단한 작업을 수행하십시오.

다음과 같은 디렉토리가 있다고 가정 해 봅시다.

lib/abc.py

그런 다음 이름이 지정된 것처럼 lib 폴더에 빈 파일을 유지하십시오.

__init__.py

그런 다음 사용

from lib.abc import <Your Module name>

__init__.py가져 오기 모듈 계층의 모든 폴더에 파일을 보관하십시오 .


답변

이런 식으로 프로젝트를 구성하는 경우 :

src\
  __init__.py
  main.py
  dirFoo\
    __init__.py
    Foo.py
  dirBar\
    __init__.py
    Bar.py

그런 다음 Foo.py에서 다음을 수행 할 수 있습니다.

import dirFoo.Foo

또는:

from dirFoo.Foo import FooObject

Tom의 의견에 따르면 src폴더를 통해 site_packages또는 검색 경로 를 통해 폴더에 액세스 할 수 있어야합니다 . 또한 언급했듯이 __init__.py해당 패키지 / 디렉토리에서 모듈을 처음 가져올 때 암시 적으로 가져옵니다. 일반적으로 __init__.py빈 파일입니다.


답변

가장 쉬운 방법은 sys.path.append ()를 사용하는 것입니다.

그러나 imp 모듈 에도 관심이있을 수 있습니다 . 내부 가져 오기 기능에 대한 액세스를 제공합니다.

# mod_name is the filename without the .py/.pyc extention
py_mod = imp.load_source(mod_name,filename_path) # Loads .py file
py_mod = imp.load_compiled(mod_name,filename_path) # Loads .pyc file 

모듈 이름을 모르는 경우 모듈을 동적으로로드하는 데 사용할 수 있습니다.

과거에는 이것을 사용하여 응용 프로그램에 대한 플러그인 유형 인터페이스를 만들었습니다. 여기서 사용자는 응용 프로그램 특정 기능으로 스크립트를 작성하고 특정 디렉토리에 해당 스크립트를 드롭합니다.

또한 이러한 기능이 유용 할 수 있습니다.

imp.find_module(name[, path])
imp.load_module(name, file, pathname, description)