상위 폴더에서 모듈 가져오기
Python 2.5를 실행하고 있습니다.
다음은 내 폴더 트리입니다.
ptdraft/
nib.py
simulations/
life/
life.py
도 (★★★★★★★★★★★★★)__init__.py
위해 서 생략)는 과 같습니다.
「Import」를 하려면 해야 하나요?nib
로부터의 접속이 가능합니다.life
?? .path.path를 만지작거리지 할 수 .
에.ptdraft
더입니니다다
상대 Import를 사용할 수 있습니다(relative imports > = 2.5).
from ... import nib
(Python 2.5의 새로운 기능) PEP 328: 절대 및 상대 Import
편집: 두 패키지 위로 이동하기 위해 점 '.'을 하나 더 추가했습니다.
(「」와 ):from .. import mymodule
에누리하다현재 모듈의 부모 디렉토리에 있는 'mymodule'을 Import하려면 다음 절차를 수행합니다.
import os
import sys
import 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__)
을 사용하여 경로)을 취득할 것을 합니다.
형제 패키지로부터의 수입에 관한 질문에도 같은 답변을 올렸습니다.여기서 볼 수 있어요.
sys.path
디스크
요약
- 코드를 하나의 폴더로 래핑합니다(예:
packaged_stuff
) - 작성하다
setup.py
setuptools를 사용하는 스크립트.셋업 - 를 사용하여 패키지를 합니다.
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
는 나나 the the the 라고 합니다..
폴더는 제 경우 폴더는 root 폴더, root 는 root 폴더는 root 폴더는 root 폴더는 root 폴더는 root 폴더는 root 폴더는 root 폴더에 .C:\tmp\test_imports
.
순서
setup.py
folder --「 」의.setup.py
말하면
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())
(임의) ★★★★★★★★★★★★★★★★★★★★"setup.py
예에 .이치노
- 가상 환경 사용
가상 환경에 익숙한 경우 가상 환경을 활성화하고 다음 단계로 건너뜁니다.가상 환경의 사용은 반드시 필요한 것은 아니지만 장기적으로 도움이 됩니다(여러 프로젝트가 진행 중인 경우).가장 기본적인 단계는 (루트 폴더에서 실행)입니다.
- 가상 환경 생성
python -m venv venv
- 가상 환경 활성화
. venv/bin/activate
(Linux) ★★./venv/Scripts/activate
승승)
- 가상 환경 비활성화
deactivate
(Linux)
이에 대한 자세한 내용은 Google에서 "python virtualenv 튜토리얼" 또는 이와 유사한 내용을 참조하십시오.작성, 활성화 및 비활성화 이외의 명령어는 필요하지 않을 수 있습니다.
가상 환경을 만들고 활성화하면 콘솔에 가상 환경의 이름이 괄호 안에 표시됩니다.
PS C:\tmp\test_imports> python -m venv venv
PS C:\tmp\test_imports> .\venv\Scripts\activate
(venv) PS C:\tmp\test_imports>
- pip 편집 가능한 상태로 프로젝트 설치
패키지 「」를 인스톨 .myproject
를 사용합니다.pip
이라면, 「이것」을 -e
플래그를 지정합니다.이렇게 하면 편집 가능한 상태로 설치되고 .py 파일에 대한 모든 편집 내용이 설치된 패키지에 자동으로 포함됩니다.
루트 디렉토리에서
pip install -e .
directorycurrent directory')를
, 되어 을 알 수.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
- 「」를 선두에 Import .
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()
러닝 라이프.화이
(venv) PS C:\tmp\test_imports> python .\ptdraft\simulations\life\life.py
I am the return value from function_from_nib!
이 문제는 모듈이 부모 디렉토리 등에 있는 것과는 관련이 없는 것 같습니다.
때 이 가 들어 있는 .ptdraft
PYTONPATH 로
이 것은 ★★★★★★★★★★★★★★★★★★★★」import nib
'아까보다'를 걸 할 거예요.ptdraft
PYTONPATH의 경우
sys.path에 기재되어 있는 "모듈 검색 경로"에서 경로에 따라 OS를 사용할 수 있습니다.따라서 다음과 같이 부모 디렉토리를 쉽게 추가할 수 있습니다.
import sys
sys.path.insert(0,'..')
parent-parent 디렉토리를 추가할 경우
sys.path.insert(0,'../..')
이것은 python 2와 3에서 모두 동작합니다.
2. python 2에 는 잘
를 다음과같이 할 수 .
import sys
sys.path.append('..')
...모듈을 Import할 수 있습니다.
PYTONPATH에 모듈폴더를 추가하는데 실패했을 경우 Python 인터프리터가 Import할 모듈을 검색하는 프로그램에서 sys.path 목록을 수정할 수 있습니다. Python 문서에는 다음과 같이 기재되어 있습니다.
spam이라는 이름의 모듈을 Import하면 인터프리터는 먼저 해당 이름의 삽입 모듈을 검색합니다.찾을 수 없는 경우 변수 sys.path.sys.path에 의해 지정된 디렉토리 목록에서 spam.py 이라는 이름의 파일을 검색합니다.이 파일은 다음 위치에서 초기화됩니다.
- 입력 스크립트를 포함하는 디렉토리(또는 현재 디렉토리)
- PYTONPATH(셸 변수 PATH와 동일한 구문을 가진 디렉토리 이름 목록).
- 설치 의존 기본값입니다.
초기화 후 Python 프로그램은 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
여기 간단한 답이 있습니다.그러면 소형 플랫폼과 크로스 플랫폼의 구조를 알 수 있습니다.
합니다.os
,sys
★★★★★★★★★★★★★★★★★」inspect
)라고 하다.
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)
은 두 .import os.path as path, sys, inspect
,inspect.
getsourcefile
첫 줄을 떼세요.(3행)
이 모듈이 Import되므로 및 가 더 할 수 「 Import 」, 「 Import 」, 「Import 」, 「Import 」, 「Import 」, 「Import 」의 순서로 설정합니다.
내 답변의 코드(긴 버전)
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.
Stack Overflow 답변 "How do I get get the
current executed file in Python?"의 예를 사용하여 내장된 도구로 실행 중인 코드의 소스(파일명)를 찾습니다.
from inspect import getsourcefile from os.path import abspath
다음으로 소스 파일을 찾으려면 다음 항목을 사용하십시오.
abspath(getsourcefile(lambda:0))
에 따라 되어 있습니다.sys.path
, python 패스리스트
Python이 해당 폴더에서 모듈을 가져올 수 있기 때문입니다.
후 Import를 실행하는.sys.path.pop(0)
된
로그프다른 경로가 아니라 가져오기 전에 추가된 목록 항목을 제거해야 합니다.
다른 않는 경우 파일 합니다. 를 하다
종료 후(쉘 후), "Python" ("Python"), ""에 편집이 .sys.path
라지지다
파일 이름 변수에 대한 참고
★★★★★★★★★★★★★★★★★★를 사용하지 않습니다.__file__
runningvariable의 파일 .
이 코드에서는, 유저가 신뢰할 수 없는 코드로 기술하는 경우가 많기 때문입니다.쓰면 안 돼요
다른 사용자가 사용하는 프로그램의 상위 폴더에서 모듈을 가져옵니다.
동작하지 않는 예(이 스택오버플로우 질문에서 인용):
• 일부 플랫폼에서는 찾을 수 없다 • 전체 파일 경로가 아닐 수 있다
py2exe
이 없다__file__
애트리뷰트가 아, 아, 아, 아, 아, 아, 아, 맞다.execute()
__file__
- X 할 수 있는 OS X 10.6
NameError: global name '__file__' is not defined
pathlib 라이브러리(>= Python 3.4와 함께 사용)를 사용하면 상위 디렉토리의 경로를 PYTONPATH에 추가하는 것이 매우 간결하고 직관적입니다.
import sys
from pathlib import Path
sys.path.append(str(Path('.').absolute().parent))
다음으로 부모 디렉토리를 sys.path에 포함하는 일반적인 솔루션을 나타냅니다(내게는 효과가 있습니다).
import os.path, sys
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
주피터 노트북(Jupyter LAB 또는 주피터 노트북으로 오픈)
Jupyter 노트북에서 작업하는 동안에는 다음과 같은 간단한 솔루션이 유용할 수 있습니다.
%cd ..
import nib
이 제품은 무선랜이 없어도 작동한다.__init__.py
filename을 클릭합니다.
Linux 및 Windows 7에서 Anaconda3로 테스트했습니다.
스크립트의 상위 디렉토리에서 패키지를 가져오는 방법은 다음과 같습니다.이 예에서 나는 이 예에서는 함수를 Import하고 싶습니다의 기능들을 수입하고 싶다.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)
상기 솔루션도 괜찮습니다.이 문제에 대한 또 다른 해결책은
최상위 디렉토리에서 원하는 항목을 가져오는 경우.그리고나서,
from ...module_name import *
또, 부모 디렉토리에서 모듈을 Import 하는 경우도 있습니다.그리고나서,
from ..module_name import *
또, 부모 디렉토리에서 모듈을 Import 하는 경우도 있습니다.그리고나서,
from ...module_name.another_module import *
이렇게 하면 원하는 경우 특정 방법을 가져올 수 있습니다.
import sys sys.path.append('../')
부모 디렉토리에 액세스하기 위한 가장 짧고 마음에 드는 oneliner는 다음과 같습니다.
sys.path.append(os.path.dirname(os.getcwd()))
또는 다음과 같이 입력합니다.
sys.path.insert(1, os.path.dirname(os.getcwd()))
os.getcwd()는 현재 작업 디렉토리의 이름을 반환하고 os.path.directoryname(directory_name)은 전달된 디렉토리의 이름을 반환합니다.
사실 Python 프로젝트 아키텍처는 부모 디렉토리의 어떤 모듈도 사용하지 않는 방식으로 이루어져야 한다고 생각합니다.이와 같은 일이 발생할 경우 프로젝트 트리에 대해 다시 생각해 볼 필요가 있습니다.
다른 방법은 PYTONPATH 시스템 환경 변수에 부모 디렉토리를 추가하는 것입니다.
원저자가 더 이상 해결책을 찾는 것이 아니라 완전성을 추구하는 것일 수도 있지만 한 가지 간단한 해결책이 있습니다.life.py을 다음과 같은 모듈로 실행합니다.
cd ptdraft
python -m simulations.life.life
이렇게 하면 ptdraft 디렉토리가 경로에 있기 때문에 nib.py에서 원하는 것을 가져올 수 있습니다.
2라인 심플한 솔루션
import os, sys
sys.path.insert(0, os.getcwd())
부모가 작업 디렉토리이고 자식 스크립트에서 다른 자식 모듈을 호출하는 경우.
모든 스크립트의 부모 디렉토리에서 모든 자식 모듈을 Import하여 다음과 같이 실행할 수 있습니다.
python child_module1/child_script.py
그 구체적인 예에서 시험해 볼 수 있다고 생각합니다만, python 3.6.3에서는
이전 답변과 동일한 스타일입니다. 단, 줄 수는 적습니다.p
import os,sys
parentdir = os.path.dirname(__file__)
sys.path.insert(0,parentdir)
file은 작업 중인 위치를 반환합니다.
Linux 시스템에서는 "life" 폴더에서 nib.py 파일로 소프트 링크를 만들 수 있습니다.다음으로 다음과 같이 Import할 수 있습니다.
import nib
git-repository 전용 솔루션이 있습니다.
처음에 사용한 것은sys.path.append('..')
및 유사한 솔루션을 제공합니다.이로 인해 특히 파일을 Import할 때 문제가 발생합니다.sys.path.append('..')
.
그리고 git 저장소의 루트 디렉토리를 항상 추가하기로 했습니다.한 줄에 다음과 같이 표시됩니다.
sys.path.append(git.Repo('.', search_parent_directories=True).working_tree_dir)
자세한 내용은 다음과 같습니다.
import os
import sys
import git
def get_main_git_root(path):
main_repo_root_dir = git.Repo(path, search_parent_directories=True).working_tree_dir
return main_repo_root_dir
main_repo_root_dir = get_main_git_root('.')
sys.path.append(main_repo_root_dir)
원래 질문: 저장소의 루트 디렉토리에 따라 Import는
import ptdraft.nib
또는
import nib
폴더 구조:
/myproject
project_using_ptdraft/
main.py
ptdraft/
__init__.py
nib.py
simulations/
__init__.py
life/
__init__.py
life.py
제가 이해하는 방법은 패키지 중심의 뷰를 갖는 것입니다.패키지 루트는ptdraft
가장 높은 레벨이기 때문에__init__.py
패키지 내의 모든 파일은 Import에 절대 경로(패키지 루트에 상대적인 것)를 사용할 수 있습니다.예를 들어,life.py
다음과 같은 것이 있습니다.
import ptdraft.nib
단, 실행하기 위해서는life.py
패키지 개발/패키지용으로python life.py
, 다음을 사용할 필요가 있습니다.
cd /myproject
python -m ptdraft.simulations.life.life
이 시점에서는 어떠한 경로도 만지작거릴 필요가 없었습니다.
더 큰 혼란은 우리가 그것을 완성할 때 입니다.ptdraft
이 패키지를 드라이버 스크립트로 사용하고 싶습니다.이 스크립트는 필연적으로 외부입니다.ptdraft
패키지 폴더, 일명project_using_ptdraft/main.py
, 패스를 만지작거릴 필요가 있습니다.
import sys
sys.path.append("/myproject") # folder that contains ptdraft
import ptdraft
import ptdraft.simulations
및 사용python main.py
스크립트를 문제없이 실행할 수 있습니다.
편리한 링크:
- https://tenthousandmeters.com/blog/python-behind-the-scenes-11-how-the-python-import-system-works/ (방법 참조)
__init__.py
★★★★★★★★★★★★★★★★★★」 - https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html#running-package-initialization-code
- https://stackoverflow.com/a/50392363/2202107
- https://stackoverflow.com/a/27876800/2202107
라이브러리로 작업합니다.nib라는 라이브러리를 만들고 setup.py을 사용하여 설치한 후 사이트 사이트에 저장하면 문제가 해결됩니다.만드는 모든 것을 한 패키지에 담을 필요는 없습니다.그것을 산산조각 내라.
다른 폴더에 파일을 Import해야 하는 Import가 있는 Flask 어플리케이션을 Import해야 하는 문제가 있었습니다.이것은 부분적으로 Remi의 답변을 사용하고 있지만 다음과 같은 저장소가 있다고 가정합니다.
.
└── service
└── misc
└── categories.csv
└── test
└── app_test.py
app.py
pipeline.py
다음 를 Import하기 에 app 를 .app.py
를 한 에 앱을 에 의해 「」, 「」, 「」, 「」가 Import ).pipeline.py
filecsv 파일 등 기타 수
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)
os.chdir('../')
from app import app
후 Flask 【Import】를 할 수 .os.chdir('./test')
작업 디렉토리가 변경되지 않도록 합니다.
부모 모듈을 실제로 Import할 필요는 없는 것 같습니다.그걸 니브로 상상해보죠.py는 func1()과 data1을 가지고 있으므로 생활에서 사용해야 합니다.화이
nib.py
import simulations.life.life as life
def func1():
pass
data1 = {}
life.share(func1, data1)
life.py
func1 = data1 = None
def share(*args):
global func1, data1
func1, data1 = args
이제 life.py에서 func1 및 데이터에 액세스할 수 있습니다.물론 사용하기 전에 life.py에 입력하도록 주의해야 합니다.
이걸 하려고 이 도서관을 만들었어요.
https://github.com/fx-kirin/add_parent_path
# Just add parent path
add_parent_path(1)
# Append to syspath and delete when the exist of with statement.
with add_parent_path(1):
# Import modules in the parent path
pass
이것이 가장 간단한 솔루션입니다.
from ptdraft import nib
모든 규칙에 위배되지만 이 가능성을 언급하고 싶습니다.
먼저 부모 디렉토리에서 자녀 디렉토리로 파일을 복사할 수 있습니다.다음으로 Import한 후 복사한 파일을 삭제합니다.
를 들면, 「 」의 경우life.py
:
import os
import shutil
shutil.copy('../nib.py', '.')
import nib
os.remove('nib.py')
# now you can use it just fine:
nib.foo()
물론 Nibs가 상대적인 Import/경로를 사용하여 다른 파일을 Import/읽으려고 할 때 몇 가지 문제가 발생할 수 있습니다.
이것은 상위 폴더에서 항목을 가져올 때 사용할 수 있습니다.
import os
os.chdir('..')
언급URL : https://stackoverflow.com/questions/714063/importing-modules-from-parent-folder
'programing' 카테고리의 다른 글
ProceedingJoinPoint에서 메서드의 주석 값을 가져오려면 어떻게 해야 합니까? (0) | 2022.09.21 |
---|---|
MariaDB 구문에 대한 SQL 구문 확인 (0) | 2022.09.21 |
다른 테이블의 값을 포함하는 mysql update 컬럼 (0) | 2022.09.19 |
JavaScript 함수를 매개 변수로 전달합니다. (0) | 2022.09.19 |
Python에서 Requests 라이브러리를 사용하여 "사용자-에이전트" 전송 (0) | 2022.09.19 |