상위 폴더에서 모듈 가져 오기


624

Python 2.5를 실행 중입니다.

이것은 내 폴더 트리입니다.

ptdraft/
  nib.py
  simulations/
    life/
      life.py

(또한 __init__.py각 폴더에는 가독성을 위해 생략했습니다)

nib모듈 내부에서 life모듈을 가져 오려면 어떻게합니까 ? sys.path로 땜질하지 않고 할 수 있기를 바랍니다.

참고 : 실행중인 기본 모듈은 ptdraft폴더에 있습니다.


1
PYTHONPATH 설정은 무엇입니까?
S.Lott

2
로스 : 나는 거기를 보았다. 그것에 대해 어떻게해야합니까? 이미 있습니다 __init__.py. S.Lott : 확인 방법을 모르겠습니다 ...
Ram Rachum

4
쉘에서 $ PYTHONPATH를 반향하십시오. 수입 시스템; Python 내에서 sys.path를 인쇄하십시오. docs.python.org/tutorial/…
S.Lott

@FlipMcF Google은 버블 검색 엔진이므로이 결과가 매우 높다는 사실은 중요하지 않습니다. 버블 링되지 않은 검색 엔진 인 DuckDuckGo도이 순위가 매우 높다는 것이 훨씬 더 중요합니다.
ArtOfWarfare

3
나는 전체 sys.path또는 PYTHONPATH답변을 건너 뛰고 np8의 훌륭한 답변을 확인 하는 것이 좋습니다 . 예, 오래 읽었습니다. 예, 많은 일처럼 보입니다. 그러나 실제로 문제를 정확하고 깨끗하게 해결하는 유일한 대답입니다.
Aran-Fey

답변:


118

문제는 상위 디렉토리에있는 모듈 또는 이와 유사한 것과 관련이없는 것 같습니다.

ptdraftPYTHONPATH에 포함 된 디렉토리를 추가해야합니다.

당신은 당신 import nib과 함께 일 했다고 말했을 것입니다 ptdraft.


15
pythonpath에 모든 것을 추가 해야하는 것은 재사용 할 수없는 많은 패키지로 작업하는 경우 좋은 해결책이 아닙니다.
Jason Cheng

@JasonCheng : 그렇다면 왜 패키지 입니까?
Davis Herring

7
나 에게이 대답은 효과가있었습니다. 그러나보다 명확하게하기 위해 절차는 import sys다음과 같습니다sys.path.append("..\<parent_folder>")
BCJuan

603

상대 가져 오기를 사용할 수 있습니다 (python> = 2.5).

from ... import nib

(Python 2.5의 새로운 기능) PEP 328 : 절대 및 상대 수입

편집 : 다른 점 '.'을 추가했습니다. 두 개의 패키지를 올리다


177
ValueError: Attempted relative import in non-package
endolith

18
@endolith : 패키지 안에 있어야합니다. 즉, init .py 파일 이 있어야 합니다.
kirbyfan64sos

31
최상위 패키지 이외의 상대 가져 오기 시도
사용자

291
더 정확하게하려면 __init__.py파일 이 필요 합니다.
kara deniz

17
추가하는 것이 있기 때문에, 또한 다음과 같은 답변을 참조하십시오 __init__.py: 당신이해야 할 유일한 것은 아니다 stackoverflow.com/questions/11536764/...
벤 농부

286

에서와 같이 상대적 가져 오기 from .. import mymodule는 패키지에서만 작동합니다. 현재 모듈의 상위 디렉토리에있는 'mymodule'을 가져 오려면 다음을 수행하십시오.

import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir) 

import mymodule

편집 : __file__속성이 항상 제공되는 것은 아닙니다. 사용하는 대신 os.path.abspath(__file__)이제 inspect 모듈을 사용하여 현재 파일의 파일 이름 및 경로를 검색하는 것이 좋습니다.


97
조금 더 짧은 :sys.path.insert(1, os.path.join(sys.path[0], '..'))
JHolta

8
삽입 대신 sys.path.append ()를 피해야하는 이유는 무엇입니까?
Tyler

2
@Tyler-다른 곳에있는 경우 문제가 될 수 parentdir있지만에 지정된 경로 중 하나에 sys.path'mymodule'이라는 이름의 다른 모듈이 있습니다. 목록 parentdir의 첫 번째 요소 로을 삽입하면 sys.path모듈을 parentdir대신 가져올 수 있습니다.
Remi

5
@JHolta 패키지를 다루지 않는다면 가장 좋은 솔루션입니다.
Jonathon Reinhart

5
@JHolta 좋은 생각. sys.path.insert(1, os.path.realpath(os.path.pardir))작동합니다.
SpeedCoder5 5

177

형제 패키지에서 가져온 수입품에 관한 질문에도 비슷한 답변을 게시했습니다. 여기서 볼 수 있습니다 .

sys.path해킹 없는 솔루션

요약

  • (예를 들어 하나 개의 폴더에 코드를 바꿈 packaged_stuff)
  • setuptools.setup ()setup.py 을 사용하는 스크립트 작성을 사용하십시오 .
  • 편집 가능한 상태로 패키지를 핍 설치 pip install -e <myproject_folder>
  • 를 사용하여 가져 오기 from packaged_stuff.modulename import function_name

설정

질문에서와 동일한 폴더 구조를 가정합니다.

.
└── ptdraft
    ├── __init__.py
    ├── nib.py
    └── simulations
        ├── __init__.py
        └── life
            ├── __init__.py
            └── life.py

.루트 폴더를 호출하고 제 경우에는에 있습니다 C:\tmp\test_imports.

단계

1) setup.py루트 폴더에 추가

내용은 setup.py간단하게

from setuptools import setup, find_packages

setup(name='myproject', version='1.0', packages=find_packages())

기본적으로 "모든" setup.py이 작동합니다. 이것은 최소한의 실례입니다.

2) 가상 환경 사용

가상 환경에 익숙한 경우 가상 환경을 활성화하고 다음 단계로 건너 뜁니다. 가상 환경에서의 사용은하지 않는 절대적으로 필요하지만 그들은 것 정말 장기적으로 당신을 도울 (당신이 진행하는 1 개 이상의 프로젝트가있을 때 ..). 가장 기본적인 단계는 (루트 폴더에서 실행)

  • 가상 환경 생성
    • python -m venv venv
  • 가상 환경 활성화
    • . /venv/bin/activate(Linux) 또는 ./venv/Scripts/activate(Win)

이에 대한 자세한 내용은 "python virtualenv tutorial"또는 유사 항목을 Google에 알려주십시오. 작성, 활성화 및 비활성화 이외의 다른 명령은 필요하지 않습니다.

가상 환경을 만들고 활성화 한 후 콘솔은 가상 환경의 이름을 괄호 안에 표시해야합니다

PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>

3) 프로젝트를 편집 가능한 상태로 pip 설치

myproject사용하여 최상위 패키지 를 설치하십시오 pip. 트릭은 -e설치를 수행 할 때 플래그 를 사용하는 것 입니다. 이렇게하면 편집 가능한 상태로 설치되고 .py 파일에 대한 모든 편집 내용이 설치된 패키지에 자동으로 포함됩니다.

루트 디렉토리에서 다음을 실행하십시오.

pip install -e . (점은 "현재 디렉토리"를 나타냄)

또한 다음을 사용하여 설치되었음을 확인할 수 있습니다. pip freeze

(venv) PS C:\tmp\test_imports> pip install -e .
Obtaining file:///C:/tmp/test_imports
Installing collected packages: myproject
  Running setup.py develop for myproject
Successfully installed myproject
(venv) PS C:\tmp\test_imports> pip freeze
myproject==1.0

4) mainfolder모든 수입 에 앞서 수입

이 예에서는 mainfolder입니다 ptdraft. 이것은 다른 모듈 이름 (python 표준 라이브러리 또는 타사 모듈에서)과 이름 충돌이 발생하지 않는 이점이 있습니다.


사용법 예

nib.py

def function_from_nib():
    print('I am the return value from function_from_nib!')

life.py

from ptdraft.nib import function_from_nib

if __name__ == '__main__':
    function_from_nib()

life.py 실행

(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!

1
왜 이것이 작동합니까? 어떻게 든 뒤에서 PYTHONPATH가 바뀌고 있습니까?
Homero Esmeraldo

2
또한 왜 이것이 sys.path 접근법을 사용하는 것보다 낫거나 더 우아합니까?
Homero Esmeraldo

5
@HomeroBarrocasSEsmeraldo 좋은 질문입니다. PYTHONPATH env var는 변경되지 않습니다. 이것은 site-packages에 설치되며 , 이미 sys.path설치되어 있으며 최종 사용자가 코드를 설치할 위치입니다. 그것은 sys.path해킹 보다 낫습니다 (그리고 해당 경로 해킹 범주에서 PYTHONPATH 사용을 포함시킬 수 있음). 이는 개발중인 코드가 다른 사용자와 동일한 방식으로 작동해야 함을 의미하기 때문입니다. 반대로 경로 수정을 사용할 때 import 문은 다른 방식으로 해결됩니다.
wim

5
이것이 내가 읽은 최고의 솔루션입니다. 이렇게하면 현재 디렉토리에 대한 링크가 만들어 지므로 코드에 대한 모든 업데이트가 작업 디렉토리에 직접 반영됩니다. 이 항목을 삭제해야하는 경우, 계란 파일을 수동으로 삭제하고 dist-packages (pip를 사용한 경우 사이트 패키지)에서 쉬운 설치에서 항목을 제거하십시오.
Rakshit Kothari

2
왜 파이썬 가져 오기 두통을 더 복잡하게합니까? 설정 파일, 가상 환경, 핍 설치를 작성해야합니까? 세상에!
Emerson Xu

68

sys.path에 나열된 "모듈 검색 경로"에서 경로에 따라 OS를 사용할 수 있습니다 . 따라서 다음과 같이 쉽게 상위 디렉토리를 추가 할 수 있습니다

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

부모-부모 디렉토리를 추가하려면

sys.path.insert(0,'../..')

이것은 파이썬 2와 3에서 모두 작동합니다.


6
이것은 현재 디렉토리와 관련이 있으며 반드시 메인 스크립트를 포함하는 디렉토리는 아닙니다.
Davis Herring

57

PYTHONPATH에 모듈 폴더를 추가하는 작업을하지 않은 경우에는 수정할 수 있습니다 sys.path에의 수입에 모듈에 대한 파이썬 인터프리터를 검색의 경우 프로그램에서 목록을 파이썬 문서 말한다 :

스팸 이라는 모듈을 가져 오면 인터프리터는 먼저 해당 이름의 내장 모듈을 검색합니다. 찾을 수 없으면 sys.path 변수가 제공 한 디렉토리 목록에서 spam.py 라는 파일을 검색합니다 . sys.path는 다음 위치에서 초기화됩니다.

  • 입력 스크립트가 들어있는 디렉토리 (또는 현재 디렉토리)
  • PYTHONPATH (쉘 변수 PATH와 동일한 구문을 가진 디렉토리 이름 목록)
  • 설치에 따른 기본값

초기화 후에 파이썬 프로그램은 sys.path 를 수정할 수 있습니다 . 실행중인 스크립트가 포함 된 디렉토리는 표준 라이브러리 경로보다 검색 경로의 시작 부분에 있습니다. 이는 해당 디렉토리의 스크립트가 라이브러리 디렉토리에 동일한 이름의 모듈 대신로드됨을 의미합니다. 교체를 의도하지 않는 한 오류입니다.

이것을 알고 있으면 프로그램에서 다음을 수행 할 수 있습니다.

import sys
# Add the ptdraft folder path to the sys.path list
sys.path.append('/path/to/ptdraft/')

# Now you can import your module
from ptdraft import nib
# Or just
import ptdraft

6
귀하의 답변은 좋지만 항상 효과가있는 것은 아니며 이식성이 떨어집니다. 프로그램이 새 위치로 이동 /path/to/ptdraft된 경우 편집해야합니다. 파일의 현재 디렉토리를 해결하고 부모 폴더에서 가져 오는 솔루션도 있습니다.
Edward

@ 에드워드 그 기술은 무엇입니까?
Shuklaswag

1
예를 들어 @Shuklaswag은 대답 stackoverflow.com/questions/714063/… .
Edward

50

파이썬 2에 대해 잘 모릅니다
. 파이썬 3에서는 다음과 같이 상위 폴더를 추가 할 수 있습니다.

import sys 
sys.path.append('..')

... 그리고 모듈에서 모듈을 가져올 수 있습니다


13
이것은 현재 작업 디렉토리가 '..'해당 모듈이있는 디렉토리로 이어지는 경우에만 작동합니다 .
user5359531

31

다음은 간단한 답변으로 작고 크로스 플랫폼의 작동 방식을 볼 수 있습니다.
내장 모듈 ( os, sysinspect) 만 사용
하므로 Python 은이를 위해 설계되었으므로 모든 운영 체제 (OS)에서 작동 해야 합니다.

더 짧은 답변을위한 코드-적은 줄과 변수

from inspect import getsourcefile
import os.path as path, sys
current_dir = path.dirname(path.abspath(getsourcefile(lambda:0)))
sys.path.insert(0, current_dir[:current_dir.rfind(path.sep)])
import my_module  # Replace "my_module" here with the module name.
sys.path.pop(0)

이 선 이하의 경우, 상기 제 2 광고를 교체 import os.path as path, sys, inspect,
추가 inspect.의 시작 getsourcefile(라인 3) 및 제 라인을 제거한다.
그러나 이것은 모든 모듈을 가져 오므로 더 많은 시간, 메모리 및 리소스가 필요할 수 있습니다.

내 답변의 코드 ( 더 긴 버전 )

from inspect import getsourcefile
import os.path
import sys

current_path = os.path.abspath(getsourcefile(lambda:0))
current_dir = os.path.dirname(current_path)
parent_dir = current_dir[:current_dir.rfind(os.path.sep)]

sys.path.insert(0, parent_dir)

import my_module  # Replace "my_module" here with the module name.

스택 오버플로 답변의 예제를 사용합니다 .Python 에서 현재
실행중인 파일 의 경로를 얻으려면 어떻게합니까 ?
내장 도구를 사용하여 실행중인 코드의 소스 (파일 이름)를 찾습니다.

from inspect import getsourcefile  
from os.path import abspath  

다음으로, 소스 파일을 찾으려면 어디서나 사용하십시오.

abspath(getsourcefile(lambda:0))

내 코드에 파일 경로를 추가 sys.path파이썬 경로 목록을
이 해당 폴더에서 가져 오기 모듈에 파이썬을 할 수 있기 때문이다.

코드에서 모듈을 가져온 후 추가 된 폴더 에 프로그램에서 나중에 가져온 다른 모듈과 이름이 같은 모듈이있는 경우 sys.path.pop(0)새 줄 에서 실행하는 것이 좋습니다 . 다른 경로가 아닌 가져 오기 전에 추가 된 목록 항목을 제거해야합니다. 프로그램이 다른 모듈을 가져 오지 않으면 프로그램이 종료 된 후 (또는 Python 셸을 다시 시작한 후) 편집 내용이 사라지기 때문에 파일 경로를 삭제하지 않는 것이 안전합니다 .



sys.path

파일 이름 변수에 대한 참고 사항

내 대답은 __file__변수를 사용하여 실행중인
코드 의 파일 경로 / 파일 이름을 얻지 않습니다. 여기서는 사용자가 종종 신뢰할 수없는 것으로 설명했기 때문 입니다. 다른 사람이 사용하는 프로그램의 상위 폴더 에서 모듈
가져 오는 데 사용해서는 안됩니다 .

작동하지 않는 몇 가지 예 ( 스택 오버플로 질문 에서 인용 ) :

• 일부 플랫폼에서는 찾을 수 없습니다. • 때로는 전체 파일 경로가 아닙니다.

  • py2exe이없는 __file__속성을하지만, 해결 방법은
  • 속성 execute()이없는 IDLE에서 실행할 때__file__
  • 내가 얻는 OS X 10.6 NameError: global name '__file__' is not defined

1
sys.path.pop(0)원하는 모듈을 가져온 후 즉시이 작업을 수행 하고 새 경로 항목을 제거했습니다 . 그러나 후속 수입은 여전히 ​​그 위치로 갔다. 예를 들어, 내가 가진 app/config, app/tools그리고 app/submodule/config. 에서 submodule삽입 app/하여 가져 오기 tools를 수행 한 다음 제거 app/하고 가져 오려고 config하지만 app/config대신에 가져옵니다 app/submodule/config.
user5359531

나는 그 중 하나를 알아 tools의 수입품config 부모 디렉토리에서 수입 중이라는 . 나중에 수행하려고 할 때 그래서 sys.path.pop(0); import config내부 submodule얻을 기대 app/submodule/config, 나는 실제로 얻고 있었다 app/config. 분명히 파이썬은 sys.path해당 이름과 일치하는 모듈 을 실제로 확인하는 대신 동일한 이름을 가진 캐시 된 버전의 모듈을 반환합니다 . sys.path이 경우 파이썬은 동일한 이름의 모듈이 이미로드되어서 확인하지 않았습니다.
user5359531

이것이 내가 가진 문제에 대한 정확한 참조라고 생각합니다. docs.python.org/3/reference/import.html#the-module-cache
user5359531

5.3.1의 유용한 정보 . 모듈 캐시 상의 문서 페이지 : 가져 오는 동안, 모듈 이름으로 조회됩니다sys.modules ... sys.modules에 쓸 수 있습니다. 키를 삭제하면 명명 된 모듈의 캐시 항목이 무효화되어 다음 가져올 때 Python이 새로 검색됩니다. ... 하지만 모듈 객체에 대한 참조를 유지하고 캐시를 무효화 한 다음 다시 가져 오는 것처럼 두 객체는 ​​달라집니다. 대조적으로, importlib.reload()모듈 내용을 재사용하고 다시 초기화합니다 ...
Edward

더 짧은 : os.path.realpath(getsourcefile(lambda:0) + "/../.."). 현재 소스 파일에 두 개의 상위 디렉토리 기호가 추가됩니다. Windows에서도 사용하여 문자열을 반환하는 os.path.sep그대로 사용하지 않았습니다 . 부모 디렉토리를 제공하는 전체 경로 (이 경우 파일 이름 및 현재 디렉토리)에서 두 디렉토리 항목을 제거합니다. getsourcefile/realpath
코번

28

부모 디렉토리를 sys.path에 포함시키는보다 일반적인 해결책은 다음과 같습니다 (작동합니다).

import os.path, sys
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))

import os, sys\n sys.path.insert(0,os.path.pardir) 같은 것, 그러나 sorther :) (의견에 줄 바꿈 없음)
Anti Veeranna

@antiveeranna, 당신이 사용하는 경우 os.path.pardir부모의 realpath를 얻을 수 없습니다, 당신이 전화를하는 상대 경로sys.path.insert()
alvas

1
이 답변은 StackOverflow 사용자가 자주 언급했듯이 신뢰할__file__없는 변수를 사용합니다 (항상 전체 파일 경로는 아니지만 모든 운영 체제에서 작동하지는 않습니다). 대답을 포함하지 않도록 변경하면 문제가 줄어들고 상호 호환성이 향상됩니다. 자세한 내용은 stackoverflow.com/a/33532002/3787376을 참조하십시오 .
Edward

23

스크립트의 부모 디렉토리에서 패키지를 가져 오는 데 다음과 같은 방식으로 작동한다는 것을 알았습니다. 이 예에서는 패키지 env.py에서 함수를 가져오고 싶습니다 app.db.

.
└── my_application
    └── alembic
        └── env.py
    └── app
        ├── __init__.py
        └── db
import os
import sys
currentdir = os.path.dirname(os.path.realpath(__file__))
parentdir = os.path.dirname(currentdir)
sys.path.append(parentdir)

따라서 멋진 한 줄짜리 :sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
juzzlin

수정 sys.path하는 것은 일반적으로 나쁜 생각입니다. 당신은 어떤 방법 (필요 예를 들어 , PYTHONPATH라이브러리에 액세스 할 수 할) 다른 코드를 (그렇지 않으면 도서관 정말 아니다) 항상 사용하십시오!
Davis Herring

14

위에서 언급 한 솔루션도 좋습니다. 이 문제에 대한 또 다른 해결책은

최상위 디렉토리에서 무언가를 가져 오려면 그때,

from ...module_name import *

또한 상위 디렉토리에서 모듈을 가져 오려는 경우. 그때,

from ..module_name import *

또한 상위 디렉토리에서 모듈을 가져 오려는 경우. 그때,

from ...module_name.another_module import *

이렇게하면 원하는 경우 특정 방법을 가져올 수 있습니다.


6
이것은 있어야하는 것처럼 보이지만 어떤 이유로 든 sys.path.append위 의 해킹과 동일한 방식으로 작동하지 않으며 이런 식으로 내 라이브러리를 가져올 수 없습니다. 이것은 내가 구글을 시작하기 전에 처음으로 시도한 것입니다 :) 좋아, 이것이ValueError: attempted relative import beyond top-level package
juzzlin

10

나를 위해 부모 디렉토리에 액세스하는 가장 짧고 가장 좋아하는 oneliner는 다음과 같습니다.

sys.path.append(os.path.dirname(os.getcwd()))

또는:

sys.path.insert(1, os.path.dirname(os.getcwd()))

os.getcwd ()는 현재 작업 디렉토리의 이름을 리턴하고 os.path.dirname (directory_name)은 전달 된 디렉토리의 디렉토리 이름을 리턴합니다.

실제로 필자의 의견으로는 Python 프로젝트 아키텍처는 하위 디렉토리의 어느 모듈도 상위 디렉토리의 모듈을 사용하지 않는 방식으로 수행해야합니다. 이와 같은 일이 발생하면 프로젝트 트리에 대해 다시 생각할 가치가 있습니다.

다른 방법은 PYTHONPATH 시스템 환경 변수에 상위 디렉토리를 추가하는 것입니다.


2
프로젝트를 재구성해야 할 가능성을 언급 한 +1 (문제에 해킹을 던지는 것과는 대조적으로)
semore_1267

이것은 부모를 얻지 못하고 현재를 얻습니다
Ricky Levi

9

Jupyter Notebook에서

Jupyter Notebook에서 작업하는 한이 간단한 솔루션이 유용 할 수 있습니다.

%cd ..
import nib

그것은 없이도 작동합니다 __init__.py파일이 합니다.

Linux 및 Windows 7에서 Anaconda3으로 테스트했습니다.


2
%cd -가져 오기 후에 추가하는 것이 합리적이지 않으므로 노트북의 현재 디렉토리는 변경되지 않습니다.
Dror


5

__init__.py파일이 있는 패키지 환경에 있지 않을 때 pathlib 라이브러리 (> = Python 3.4에 포함)를 사용하면 부모 디렉토리의 경로를 PYTHONPATH에 추가하는 것이 매우 간결하고 직관적입니다.

import sys
from pathlib import Path
sys.path.append(str(Path('.').absolute().parent))

init .py 를 사용 하여이 문제를 피할 수 있습니까?
ArtificiallyIntelligence

4

과거의 답변과 같은 종류의 스타일-하지만 더 적은 줄 : P

import os,sys
parentdir = os.path.dirname(__file__)
sys.path.insert(0,parentdir)

파일은 작업중 인 위치를 반환합니다


나에게 파일 은 경로가 포함 되지 않은 파일 이름 입니다. "ipy filename.py"를 사용하여 실행합니다.
커티스 얄롭

위의 예에서 @CurtisYallop 안녕하세요. 파이썬 파일이있는 파일 (현재있는 파일)을 포함하는 dir을 추가합니다. 파일 이름을 가진 os.path.dirname 호출은 파일의 경로를 반환해야합니다. 파일을 명시 적으로 지정하지 않고 경로에 THAT를 추가하는 중-HTH 's :-)
YFP

__file__에 항상 경로와 파일이 포함되어 있다고 가정합니다. 때로는 경로가없는 파일 이름 만 포함합니다.
커티스 얄롭

@ CurtisYallop-전혀 아닙니다. 파일 이 파일 이름 이라고 가정하고 파일 경로를 얻기 위해 os.path.dirname ()을 사용하고 있습니다. 작동하지 않는 예가 있습니까? 재생산의 단계를 좋아합니다
YFP

1
@CurtisYallop-아니, 난 아니야! print / _ / file / _ / 은 "file.py"위의 예에서 파일 이름을 제공합니다. 그러면 os.path.dirname ()을 사용하여 전체 경로를 가져올 수 있습니다 . 이상한 위치에서 전화를 걸고 관계형을 원한다면 os 모듈 인 Jeez를 통해 작업 디렉토리를 쉽게 찾을 수 있습니다.
YFP

1

라이브러리로 작업하십시오. nib라는 라이브러리를 만들고 setup.py를 사용하여 설치하고 사이트 패키지에 상주하면 문제가 해결됩니다. 모든 것을 하나의 패키지에 담을 필요는 없습니다. 조각으로 나눕니다.


1
아이디어는 좋지만 일부 사람들은 모듈을 코드와 함께 번들로 묶기를 원할 수 있습니다. 아마도 이식성을 높이고 site-packages다른 컴퓨터 에서 모듈 을 실행할 때마다 모듈을 넣을 필요가 없습니다 .
Edward

0

Linux 시스템에서는 "life"폴더에서 nib.py 파일로의 소프트 링크를 작성할 수 있습니다. 그런 다음 간단히 다음과 같이 가져올 수 있습니다.

import nib
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.