Python의 상대 경로에서 가져오기
클라이언트 코드용 폴더, 서버 코드용 폴더 및 이들 간에 공유되는 코드용 폴더가 있습니다.
Proj/
Client/
Client.py
Server/
Server.py
Common/
__init__.py
Common.py
Server.py 및 Client.py 에서 Common.py 을 가져오려면 어떻게 해야 합니까?
2014년 11월 편집(3년 후):
Python 2.6 및 3.x는 적절한 상대 가져오기를 지원하므로 해킹을 방지할 수 있습니다.이 방법을 사용하면 절대 가져오기가 아닌 상대 가져오기를 수행하게 됩니다.'...'는 제 위에 있는 디렉토리로 이동한다는 의미입니다.
from ..Common import Common
주의할 점으로, 이것은 패키지 외부에서 파이썬을 모듈로 실행하는 경우에만 작동합니다.예:
python -m Proj
원래의 핵키 방식
이 방법은 패키지를 실제로 '설치'하지 않는 일부 상황에서 여전히 일반적으로 사용됩니다.예를 들어, 그것은 장고 사용자들에게 인기가 있습니다.
Common/을 sys.path(Python이 항목을 가져오기 위해 확인하는 경로 목록)에 추가할 수 있습니다.
import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common'))
import Common
os.path.dirname(__file__)
현재 python 파일이 있는 디렉터리를 제공한 다음 'Common/' 디렉터리로 이동하여 모듈을 'Common'으로 가져옵니다.
재미있게도, 방금 만난 것과 같은 문제가 있습니다. 그리고 저는 다음과 같은 방식으로 이 일을 하게 됩니다.
Linux 명령과 결합ln
훨씬 더 단순하게 만들 수 있습니다.
1. cd Proj/Client
2. ln -s ../Common ./
3. cd Proj/Server
4. ln -s ../Common ./
그리고, 이제 가져오기를 원한다면,some_stuff
파일에서:Proj/Common/Common.py
파일로:Proj/Client/Client.py
바로 이와 같이:
# in Proj/Client/Client.py
from Common.Common import some_stuff
그리고, 동일하게 적용됩니다.Proj/Server
에도 적용됩니다.setup.py
여기서 논의된 것과 같은 질문인 프로세스가 도움이 되기를 바랍니다!
상대적인 가져오기를 수행하는 것은 절대적으로 괜찮습니다!꼬마 올미가 하는 일은 다음과 같습니다.
#first change the cwd to the script path
scriptPath = os.path.realpath(os.path.dirname(sys.argv[0]))
os.chdir(scriptPath)
#append the relative location you want to import from
sys.path.append("../common")
#import your module stored in '../common'
import common.py
상대 가져오기를 수행하지 않습니다.
PEP8에서:
패키지 내 수입을 위한 상대적 수입은 매우 권장되지 않습니다.
모든 코드를 하나의 슈퍼 패키지(즉, "myapp")에 넣고 클라이언트, 서버 및 공통 코드에 대한 하위 패키지를 사용합니다.
업데이트: "Python 2.6 및 3.x는 적절한 상대 가져오기를 지원합니다(...)."자세한 내용은 Dave의 답변을 참조하십시오.
기본 가져오기 방법은 이미 PYONPATH에서 "상대적"입니다.PYTHONPATH는 기본적으로 원본 파일의 폴더와 함께 일부 시스템 라이브러리에 대한 것입니다.-m으로 실행하여 모듈을 실행하면 현재 디렉터리가 PYONPATH에 추가됩니다.따라서 프로그램의 진입점이 Proj 내부에 있다면,import Common.Common
Server.py 과 Client.py 모두에서 작동해야 합니다.
상대적인 가져오기를 수행하지 않습니다.당신이 원하는 대로 되지 않을 것입니다.
파이썬 세계의 초보자를 위한 간단한 대답
간단한 예제 만들기
도망친다고 가정합니다.ls -R
다음과 같은 결과가 표시됩니다.
./second_karma:
enemy.py import.py __init__.py math
./second_karma/math:
fibonacci.py __init__.py
는 이 을 실행합니다.$ python3 second-karma/import.py
init.py 은 빈 파일이지만 존재해야 합니다.
이제 내부에 무엇이 있는지 살펴보겠습니다.second-karma/import.py
:
from .math.fibonacci import Fibonacci
fib = Fibonacci()
print(fib.get_fibonacci(15))
그고그 있것는 것.second_karma/math/fibonacci.py
:
from ..enemy import Enemy
class Fibonacci:
enemy: Enemy
def __init__(self):
self.enemy = Enemy(150,900)
print("Class instantiated")
def get_fibonacci(self, which_index: int) -> int:
print(self.enemy.get_hp())
return 4
은 이제마파일은입니다.second_karma/enemy.py
:
class Enemy:
hp: int = 100
attack_low: int = 180
attack_high: int = 360
def __init__(
self,
attack_low: int,
attack_high: int) -> None:
self.attack_low = attack_low
self.attack_high = attack_high
def getAttackPower(
self) -> {"attack_low": int, "attack_high": int}:
return {
"attack_low": self.attack_low,
"attack_high": self.attack_high
}
def get_hp(self) -> int:
return self.hp
이제 작동하지 않는 이유에 대한 간단한 대답입니다.
- Python은 기본적으로 하나 이상의 모듈과 0 이상의 패키지를 포함하는 폴더인 패키지 개념을 가지고 있습니다.
- 파이썬을 실행할 때 두 가지 방법이 있습니다.
- python에게 특정 모듈을 실행하도록 요청하는 중(
python3 path/to/file.py
). - python에게 패키지 실행을 요청하는 중입니다.
- python에게 특정 모듈을 실행하도록 요청하는 중(
- 는 문는입니다.
import.py
에서는 가져오기를 합니다..math
- 그
.math
서 의미하는 것은 "." 맥수락 "학패이라를" "을는이가" "름진현패/키지를찾" "합니다오시으미의십이모"입니다. - 문제:
- 가 다과같이실때로 할 때.
$ python3 second-karma/import.py
나는 패키지가 아닌 모듈을 실행하고 있습니다.따라서 파이썬은 무엇인지 전혀 모릅니다..
문맥에서 하는 것은 이입니다. - 수정:
python3 -m second_karma.import
- 지금이다
import.py
package 위상의우경지second_karma
따라서 상대적인 수입이 효과가 있을 것입니다.
- 가 다과같이실때로 할 때.
- 그
중요한 참고:
그것들의__init__.py
필수 항목이며 이러한 항목이 없는 경우 먼저 만들어야 합니다.
github의 예
- 읽어주세요
README.md
잘 이해하기 ▁for하▁a기. - 커밋 사이를 왔다 갔다 하면 문제를 더욱 깊이 관찰할 수 있습니다.
- https://github.com/kasir-barati/my-python-journey/tree/main/second_karma
제가 사용한 접근법은 위에서 언급한 Gary Beardsley와 약간의 변화가 있습니다.
파일 이름:서버.파이의
import os, sys
script_path = os.path.realpath(os.path.dirname(__name__))
os.chdir(script_path)
sys.path.append("..")
# above mentioned steps will make 1 level up module available for import
# here Client, Server and Common all 3 can be imported.
# below mentioned import will be relative to root project
from Common import Common
from Client import Client
언급URL : https://stackoverflow.com/questions/7505988/importing-from-a-relative-path-in-python
'source' 카테고리의 다른 글
Xcode -- $(SRCROOT)란 무엇입니까? (0) | 2023.05.27 |
---|---|
Angular2가 버튼을 클릭할 때 양식을 체계적으로 제출하지 않도록 합니다. (0) | 2023.05.27 |
Sublime Text 2에서 Ctrl+D를 여러 개 선택할 때 일치를 건너뛸 수 있는 방법은 무엇입니까? (0) | 2023.05.22 |
바우어의 기본 구성 요소 폴더를 변경하는 방법은 무엇입니까? (0) | 2023.05.22 |
SQL을 통해 최소 순차적 액세스 기간을 결정하시겠습니까? (0) | 2023.05.22 |