syspath에 파이썬 모듈을 추가하는 방법?


69

다음과 같은 파일 구조가 있습니다.

Folder
   Common
      foo1.py
   TestFolder
      foo2.py

foo2.py 및 에 가져오고 싶습니다 foo1.py. 시도했지만 우분투에서는 작동하지 않습니다.

sys.path.append(os.path.abspath('../../'))
from Common import foo1.py

당신은 가지고 있습니까 __init__.py폴더에 파일을? 이것은 파이썬이 패키지를 생성하고 그 패키지에서 모듈을 가져올 수있게하는 방법입니다. guide.python-distribute.org/creation.html
Bryan

Common 및 TestFolder에 init.py 파일이 있습니다
user284474

가져 오려면 하위 폴더뿐만 아니라 폴더 디렉토리에도 필요합니다.
Bryan

init .py가 비어 있습니까?
user284474

1
예, 비어있을 수 있습니다. 패키지에 특정 구성이 필요하지 않으면 비워 두어야합니다.
Bryan

답변:


115

파이썬이 모듈을 찾는 방법

엄밀히 말하면, 모듈 은 단일 python 파일이며, 패키지 는 python 파일을 포함하는 폴더이며, 이름이 (비어있을 수 있음) 파일과 함께 __init__.pypython에게 모듈을 가져올 패키지임을 알려줍니다. 두 경우 모두 모듈은 .py확장이 필요 하지만 가져 오기는 수행하지 않고 수행됩니다 (아래 추가 참조).

기본적으로 Python은에서 모듈과 패키지를 찾습니다 $PYTHONPATH.

$ PYTHONPATH에 무엇이 포함되어 있는지 확인하려면 python (3)에서 다음 코드를 실행하십시오.

import sys
print(sys.path)

디렉토리를 추가하는 방법

때때로

파이썬 파일 내에서 파이썬 응용 프로그램 또는 스크립트의 헤드 섹션에 다음 줄을 추가하여 때때로 경로를 기본 경로에 추가 할 수 있습니다.

import sys
sys.path.insert(0, "/path/to/your/package_or_module")

예를 들면 다음과 같습니다.

폴더 : /home/myname/pythonfiles가 있고 module_1.py해당 디렉토리에 있는 파일을 가져 오려면 이 코드를 head 섹션에 추가하십시오.

import sys
sys.path.insert(0, "/home/myname/pythonfiles")

그리고 간단히 다음과 같이 파일 module_1.py을 가져올 수 있습니다 .

import module_1

패키지를 만들고 패키지에서 모듈을 가져 오려면 모듈을 $PYTHONPATH포함 하는 폴더를 (비어있을 수 있음) 파일과 함께 폴더를 만들어야합니다__init__.py

예를 들면 다음과 같습니다.

에서 호출 my_package된 패키지 (폴더) 에서 가져 오려면 예제 1과 같이에 경로를 /home/myname/pythonfiles추가하고 /home/myname/pythonfiles다음 $PYTHONPATH과 같이 module_2.py간단히 패키지 폴더 내에서 호출 된 모듈을 가져 오십시오 .

from <packagename> import module_2

$PYTHONPATH영구적으로 디렉토리 추가 :

~/.profile파일에 다음 줄을 추가 하십시오.

export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add

하위 디렉토리

패키지 내에서 하위 디렉토리는 그렇게 포함되지 않습니다. 디렉토리를 "체인"해야합니다. module_3.py폴더 subfolder안의 폴더 내 에서 모듈을 가져 오려면 packagename:

import packagename.subfolder.module_3

패키지의 모든 하위 폴더에는 자체 __init__.py파일이 포함되어 있습니다.

모듈이 스크립트 또는 애플리케이션과 동일한 디렉토리에있는 경우

스크립트 나 응용 프로그램과 같은 디렉토리에 있으면 모듈에 대한 경로를 삽입 할 필요가 없으며 자동으로 추가됩니다.

예:

script.pyand가 포함 된 폴더가 있으면 module.py간단히 다음 과 같이 모듈을 가져올 수 있습니다.

import module

또한 Python 3을 대상으로하거나 향후에 타겟팅 할 계획 인 경우 특히 python.org/dev/peps/pep-0328을 읽는 것이 좋습니다.
zaadeh

printenv PYTHONPATH아무것도 없습니까?
Stevie G

1
sys.path.append("/path/to/your/package_or_module")또한 기본값에 경로를 추가하고 덜 혼란 스럽습니다. sys.path.insert(0,...)어느 0것이 첫 번째 인수인지 비교합니다 .
Paul Rougieux

1
@PaulRougieux : 경로를 추가 할 때의 문제는 모듈이 경로의 다른 위치 (예 : .egg 파일)에 이미 존재할 수 있으며 파일의 버전 대신 해당 버전의 모듈을 선택 한다는 것입니다.
snark

6

상대 가져 오기를 사용하는 올바른 방법은 다음과 같습니다.

from ..Common import foo1

또한 __init__.py모든 폴더에 a 가 필요합니다 .


1
고마워. 그러나 두 개의 폴더가있는 모듈이 있다면 어떻게 가져올 수 있습니까? from .... Folder가 작동하지 않습니다
user284474

단일 레벨에서 작동합니까?
Sylvain Pineau

단일 수준으로 작동합니다.
user284474

좋아요,이 대답을 받아 주시겠습니까? 다단계 당신은 다른 질문을 할 수 있지만하지만 처음 이것 좀 걸릴 질문 패키지 내부에 모듈을 호출 할 수있는 최선의 방법에 대한
실뱅 피노

Python 2 또는 Python 3에 해당됩니까? 아니면 둘다?
alex

2

주의 :이 답변은 최신 버전의 python 3에서는 구식이지만 이전 버전에서는 여기에 있습니다. 자세한 내용은 의견을 읽고 https://www.python.org/dev/peps/pep-0420/


기본적으로 syspath에 추가하려는 파이썬 코드가있는 모든 폴더에는 __init__.py 파일이 필요합니다. 이 __init__.py 파일은 비어있을 수 있습니다.


알다시피, 이것은 더 이상 사실이 아니며, 디렉토리는 이제 "네임 스페이스"가됩니다.
Aaron Hall

@AaronHall 흥미로운 소스?
don.joey

1
증거를 위해 이것을 시도하십시오 : python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"또한 네임 스페이스 패키지 의미의 추가를 설명하는
Aaron Hall
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.