로컬 디렉토리에서 인터프리터로 파이썬 패키지 가져 오기


87

내 로컬 디렉토리에서 패키지를 개발 / 테스트 중입니다. 인터프리터 (v2.5)로 가져오고 싶지만 sys.path에 현재 디렉터리가 포함되어 있지 않습니다. 지금은 sys.path.insert(0,'.'). 더 좋은 방법이 있습니까?

또한,

from . import mypackage

이 오류로 실패합니다.

ValueError: Attempted relative import in non-package

그 "."는 어디서 읽었습니까? 파이썬 모듈 이었나요?
S.Lott

16
: @Lott : 그것은 상대 수입 경로가 여기에 설명이다 docs.python.org/reference/...
projectshave

1
이 명확한 가이드를보고 할 수 있습니다 chrisyeh96.github.io/2017/08/08/...
케빈 Zhu의에게

답변:


46

패키지의 일부로 가져온 모듈에서만 상대 가져 오기를 사용할 수 있습니다. 스크립트 또는 대화 형 인터프리터는 그렇지 않았으므로 물론 from . import( "내가 가져온 동일한 패키지에서 가져 오기"를 의미합니다.) 작동하지 않습니다. import mypackage의 상위 디렉토리를 확인하면 잘 될 것 mypackage입니다 sys.path(당신이 당신의 현재 디렉토리를 얻을 관리 방법 멀리 에서 sys.path나도 몰라? - 당신이 site.py에서 이상한 일이 있거나 할 ...)

현재 디렉토리를 다시 가져 오는 sys.path것은 실제로 거기에 넣는 것보다 더 좋은 방법은 없습니다.


Ubuntu 8.10 용 Python 2.5에는 인터프리터의 sys.path에 현재 디렉터리 (빈 문자열)가 없습니다. 나는 아무것도 변경하지 않았으므로 어떻게 든 그렇게 배송되었습니다. 방금 3.0을 설치했고 sys.path에는 sys.path에 ''가 있습니다.
projectshave

@projectshave, 좋아, 우분투는 의심 할 여지가 없다. 8.04 (현재 우리가 직장에서 사용하는 것)에서 그 사실을 알아 차리지 못했지만 아마도 충분한주의를 기울이지 않았을 것입니다.
Alex Martelli

1
나는 부분적으로 틀렸다. 쉘에서 호출 된 Python은 sys.path에 현재 디렉토리가 있습니다. Emacs에서 호출 된 Python에는 현재 디렉토리가 없습니다. 이상한.
프로젝트는

1
아 글쎄, 우분투와 반대되는 이유가있는 것은 Emacs 다. (vim 사용자로서 나는 정말로 모른다 ;-). 조건부로 '.'를 삽입 할 수 있습니다. 물론 sys.path에 있습니다.
Alex Martelli

@Alex Martelli : 정말 감사합니다! 내 애드온 (Anki 용)이 '로컬로'스크립트로 실행될 때 다른 import 문이 필요한 이유에 대한 솔루션을 검색하고 검색했습니다. 대신 local_launch () 메서드를 추가 하고 패키지 폴더 외부 의 스크립트에서 모든 것을 가져 오거나 시작했을 때 매력처럼 작동했습니다!
Jon Coombs 2014 년

18

sys.path에 대한 문서를 참조하십시오.

http://docs.python.org/library/sys.html#sys.path

인용하려면 :

스크립트 디렉토리를 사용할 수없는 경우 (예 : 인터프리터가 대화식으로 호출되거나 스크립트가 표준 입력에서 읽혀지는 경우) path [0]은 빈 문자열이며, 이는 Python이 먼저 현재 디렉토리에서 모듈을 검색하도록 지시합니다.

따라서 모듈이 포함 된 디렉토리에서 Python 인터프리터를 시작하는 경우 sys.path를 사용하여 원숭이를 만들 필요가 없습니다.

또한 패키지를 가져 오려면 다음을 수행하십시오.

import mypackage

패키지가 포함 된 디렉토리가 이미 sys.path에 있으므로 제대로 작동합니다.


1
작업 환경의 다른 곳에 유사한 파일 이름이 있으면 실패합니다.
JAR.JAR.beans

@ JAR.JAR.beans 현재 작업 디렉토리는 sys.path작업 환경의 다른 곳에서 파일보다 먼저 찾을 수 있도록 파일 의 첫 번째 항목 이어야합니다.
SpoonMeiser

3
좋은 지적. 즉, 로컬 디렉토리에서 파일을 실행하는 경우입니다. 경우에 그것은 다른 폴더, 그리고 sys.path에의 변경이 필요한 경우 - 그것은 의미 sys.path.insert(0, new_path)보다는 sys.path.append(new_path).
JAR.JAR.beans

15

수정되지 않은 Python 스크립트를 실행하여 특정 로컬 디렉토리에서 라이브러리를 가져 오려면 PYTHONPATH환경 변수를 설정할 수 있습니다 ( 예 : bash에서).

export PYTHONPATH=/home/user/my_libs
python myscript.py

현재 작업 디렉토리에서 가져 오려면 다음 .표기법을 사용하십시오 .

export PYTHONPATH=.
python myscript.py

PYTHONPATH 내보내기에는 Python 외부 프로그래밍 (예 : bash)이 포함됩니다. 또한 docs.python.org/3/using/cmdline.html 에서 " 기본 검색 경로는 설치에 따라 다릅니다 " 라고 명시되어 있습니다.
일리아스 일리아 디스

13

간단하게 유지 :

 try:
     from . import mymodule     # "myapp" case
 except:
     import mymodule            # "__main__" case

7
이 솔루션이 마음에 들어 가장 간단합니다. 유일한 남은 질문은 왜 수입을 구현할 때 "유일한 방법"규칙이 선택 사항으로 간주 되었는가입니다. 패키지를 선언하고 구성하는 방법은 약 15 가지가 있으며 모두 단점이 있습니다
Léo Germond

5

작동하게하는 간단한 방법은 파이썬의 -m플래그를 사용하여 부모 디렉토리에서 스크립트를 실행하는 것 python -m packagename.scriptname입니다. 분명히이 상황에서 __init__.py디렉토리를 패키지로 바꾸려면 파일 이 필요 합니다.


5

패키지 내부에 setup.py 가 있으면 설치하는 것이 좋습니다.

pip install -e .

3

사용 sys.path은 이미 현재 디렉토리를 포함해야합니다.

시험:

import .

또는:

from . import sth

그러나 좋은 습관이 아닐 수 있으므로 다음을 사용하지 마십시오.

import mypackage

5
<import mypackage>의 문제는 전역 파이썬 환경에서 패키지를로드하고 로컬 폴더에서 패키지 / 파일을로드 할 수 있지만 작업 환경에있는 다른 임의의 mypackge를로드 할 수 있다는 것입니다.
JAR.JAR.beans

3

파티에 조금 늦었지만 이것이 저에게 효과적이었습니다.

>>> import sys
>>> sys.path.insert(0, '')

분명히 빈 문자열이 있으면 Python은 현재 디렉터리에서 찾아야한다는 것을 알고 있습니다. sys.path이 오류를 일으킨 에 빈 문자열 이 없습니다.


1

내가 사용하는 pathlib내가 나를 위해 패키지와 @maninthecomputer 응답으로 작업을 모듈을하지 않았다 설치하지 않도록 원하는대로 내 시스템 경로에 내 모듈 디렉토리를 추가

import sys
from pathlib import Path

cwd = str(Path(__file__).parent)
sys.path.insert(0, cwd)
from my_module import my_function
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.