source

Python의 상대 경로에서 가져오기

ittop 2023. 5. 27. 11:56
반응형

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.63.x는 적절한 상대 가져오기를 지원합니다(...)."자세한 내용은 Dave의 답변을 참조하십시오.

기본 가져오기 방법은 이미 PYONPATH에서 "상대적"입니다.PYTHONPATH는 기본적으로 원본 파일의 폴더와 함께 일부 시스템 라이브러리에 대한 것입니다.-m으로 실행하여 모듈을 실행하면 현재 디렉터리가 PYONPATH에 추가됩니다.따라서 프로그램의 진입점이 Proj 내부에 있다면,import Common.CommonServer.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에게 패키지 실행을 요청하는 중입니다.
  • 는 문는입니다.import.py에서는 가져오기를 합니다..math
    • .math서 의미하는 것은 "." 맥수락 "학패이라를" "을는이가" "름진현패/키지를찾" "합니다오시으미의십이모"입니다.
    • 문제:
      • 가 다과같이실때로 할 때.$ python3 second-karma/import.py나는 패키지가 아닌 모듈을 실행하고 있습니다.따라서 파이썬은 무엇인지 전혀 모릅니다.. 문맥에서 하는 것은 이입니다.
      • 수정:
        python3 -m second_karma.import
        
      • 지금이다import.py package 위상의우경지second_karma따라서 상대적인 수입이 효과가 있을 것입니다.

중요한 참고:

그것들의__init__.py필수 항목이며 이러한 항목이 없는 경우 먼저 만들어야 합니다.

github의 예

제가 사용한 접근법은 위에서 언급한 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

반응형