전체 경로가 주어진 모듈을 가져 오는 방법은 무엇입니까? 파이썬 모듈을

전체 경로가 주어진 파이썬 모듈을 어떻게로드 할 수 있습니까? 파일은 구성 옵션이므로 파일 시스템의 어느 위치 에나있을 수 있습니다.



답변

Python 3.5 이상을 사용하는 경우 :

import importlib.util
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()

Python 3.3 및 3.4의 경우 다음을 사용하십시오.

from importlib.machinery import SourceFileLoader

foo = SourceFileLoader("module.name", "/path/to/file.py").load_module()
foo.MyClass()

(Python 3.4에서는 더 이상 사용되지 않습니다.)

파이썬 2의 경우 :

import imp

foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()

컴파일 된 파이썬 파일과 DLL에 대해 동등한 편의 기능이 있습니다.

http://bugs.python.org/issue21436 도 참조하십시오 .


답변

sys.path에 경로를 추가하면 (imp를 사용하여) 단일 패키지에서 둘 이상의 모듈을 가져올 때 작업을 단순화한다는 이점이 있습니다. 예를 들면 다음과 같습니다.

import sys
# the mock-0.3.1 dir contains testcase.py, testutils.py & mock.py
sys.path.append('/foo/bar/mock-0.3.1')

from testcase import TestCase
from testutils import RunTests
from mock import Mock, sentinel, patch

답변

최상위 모듈이 파일이 아니지만 __init__.py를 사용하여 디렉토리로 패키지 된 경우 허용되는 솔루션은 거의 작동하지만 그다지 좋지는 않습니다. Python 3.5 이상에서는 다음 코드가 필요합니다 ( ‘sys.modules’로 시작하는 추가 된 줄에 유의하십시오).

MODULE_PATH = "/path/to/your/module/__init__.py"
MODULE_NAME = "mymodule"
import importlib
import sys
spec = importlib.util.spec_from_file_location(MODULE_NAME, MODULE_PATH)
module = importlib.util.module_from_spec(spec)
sys.modules[spec.name] = module
spec.loader.exec_module(module)

이 행이 없으면 exec_module이 실행될 때 최상위 __init__.py의 상대 가져 오기를 최상위 모듈 이름 (이 경우 “mymodule”)에 바인딩하려고합니다. 그러나 “mymodule”은 아직로드되지 않았으므로 “SystemError : 상위 모듈 ‘mymodule’이 (가)로드되지 않았습니다. 상대적 가져 오기를 수행 할 수 없습니다”라는 오류가 발생합니다. 따라서 이름을로드하기 전에 바인딩해야합니다. 그 이유는 상대 수입 시스템의 근본적인 불변입니다. ), 후자는 여기에 설명 된대로 전자의 foo 속성으로 표시되어야합니다 .


답변

모듈을 가져 오려면 해당 디렉토리를 환경 변수에 임시 또는 영구적으로 추가해야합니다.

일시적으로

import sys
sys.path.append("/path/to/my/modules/")
import my_module

영구적으로

.bashrc파일에 다음 줄을 추가하고 (Linux에서) source ~/.bashrc터미널에서 excecute :

export PYTHONPATH="${PYTHONPATH}:/path/to/my/modules/"

크레딧 / 소스 : saarrrr , 또 다른 스택 교환 질문


답변

구성 파일 (여러 부작용과 추가 합병증이 많이 있음)을 가져 오기를 원하지 않고 실행하기 만하면 결과 네임 스페이스에 액세스 할 수 있습니다. 표준 라이브러리는 runpy.run_path 형식으로 API를 제공합니다 .

from runpy import run_path
settings = run_path("/path/to/file.py")

이 인터페이스는 Python 2.7 및 Python 3.2 이상에서 사용할 수 있습니다


답변

이와 같은 작업을 수행하고 구성 파일이 Python로드 경로에있는 디렉토리를 추가 한 다음 파일 이름을 미리 알고있는 경우 (이 경우 “config”) 정상적인 가져 오기를 수행하면됩니다.

지저분하지만 작동합니다.

configfile = '~/config.py'

import os
import sys

sys.path.append(os.path.dirname(os.path.expanduser(configfile)))

import config

답변

당신은 사용할 수 있습니다

load_source(module_name, path_to_file) 

imp 모듈의 메소드 .