`import os.path` 또는`import os`를 사용해야합니까?


139

에 따르면 공식 문서 , os.path모듈입니다. 따라서 가져 오기를 선호하는 방법은 무엇입니까?

# Should I always import it explicitly?
import os.path

또는...

# Is importing os enough?
import os

"수입 os작품 "에 대답하지 마십시오 . 나는 그것이 지금도 나를 위해 작동한다는 것을 알고있다 (Python 2.6 현재). 내가 알고 싶은 것은이 문제에 대한 공식 권장 사항입니다. 따라서이 질문에 대한 답변이 있으면 참조게시하십시오 .

답변:


157

os.path재미있는 방식으로 작동합니다. 것 같습니다 os서브 모듈과 패키지해야 path하지만, 현실 os과 마술을하는 일반 모듈 sys.modules주입은 os.path. 다음과 같은 일이 발생합니다.

  • Python이 시작되면에 많은 모듈을로드합니다 sys.modules. 스크립트의 어떤 이름에도 바인딩되지 않지만 어떤 방식 으로든 가져올 때 이미 작성된 모듈에 액세스 할 수 있습니다.

    • sys.modules어떤 모듈이 캐시되는지에 대한 내용입니다. 모듈을 가져올 때 이미 가져 오면 인스턴스가에 저장됩니다 sys.modules.
  • os파이썬이 시작될 때로드되는 모듈 중 하나입니다. pathOS 고유의 경로 모듈에 속성을 지정합니다 .

  • 하위 모듈 인 것처럼 sys.modules['os.path'] = path" import os.path" 을 수행 할 수 있도록 주입 합니다.

내가 생각하는 경향 os.path으로 내가 사용하고자하는 모듈 이 아닌 에서 일 os모듈 그렇지 않은 순간에도, 정말 라는 패키지의 서브 모듈 os, 나는 그것이 하나처럼의 종류를 가져오고 나는 항상import os.path . 이것은 os.path문서화 방법과 일치 합니다.


덧붙여 말하자면, 이런 종류의 구조는 모듈과 패키지 및 코드 구성에 대한 많은 파이썬 프로그래머의 초기 혼란을 초래한다고 생각합니다. 이것은 실제로 두 가지 이유입니다

  1. os패키지로 생각 import os하고 서브 모듈에 액세스 os.path할 수 있고 액세스 할 수 있다는 것을 알고 있다면 , 가져 오지 않고 수행 할 수없고 import twisted자동으로 액세스 할 때 나중에 놀라게 될 수 있습니다 twisted.spread.

  2. 그것은 os.name정상적인 것, 문자열이며 os.path모듈 이라는 것이 혼란 스럽습니다 . 나는 항상 패키지를 빈 __init__.py파일로 구성하여 같은 수준에서 항상 모듈 / 패키지 또는 다른 것들의 한 가지 유형을 갖습니다. 몇몇 큰 파이썬 프로젝트는이 접근 방식을 취하는데,보다 구조화 된 코드를 만드는 경향이 있습니다.


훌륭하고 유익한 답변! 축하합니다! 질문에 직접 대답하지는 않지만 유용한 세부 정보가 많이 있습니다. "os.path가 문서화되는 방법과 일치합니다"에 대해 자세히 설명해 주시겠습니까? Chris Hulan이 말했듯이 os.walk () 예제는 os.path 대신 os 만 가져옵니다.
Denilson Sá Maia

3
@ Denilson, 그것은 직접적인 대답을 포함합니다 : 나는 항상 import os.path스스로하고 더 좋은 방법이라고 생각합니다. "이것은 os.path가 문서화 된 방법과 일치합니다"라는 말은 docs.python.org/library/os.path.html 의 문서에서 자체 페이지를 제공한다는 것을 의미했습니다 .
Mike Graham

1
와우에 os.py실제로 주입합니다 sys.modules['os.path']. 이것이 from os.path import something실제로 작동하는 이유 입니다. 이것이 언제 소개되고 소스를 확인했는지 궁금했습니다. 재미있는 사실 : 이것은 1999 년이며, Python 1.5.2에 처음 포함되었습니다. 원래 커밋은 여기에 있습니다 .
Bluehorn

29

에 따라 PEP-20 팀 피터스 (Tim Peters)에 의해, 그리고 "가독성 카운트" "노골적인 암시보다 낫다". os모듈 에서 필요한 모든 것이 아래 os.pathimport os.path있는 경우보다 명확하게 설명하고 다른 사람들에게 실제로 관심있는 사항을 알려주십시오.

마찬가지로, PEP-20은 또한 "단순이 복잡한 것보다 낫다"고 말합니다. 따라서보다 일반적인 os우산 아래에있는 물건이 필요한 경우 import os선호됩니다.


2
나는 import os의미있는 방식으로 어떻게 "단순"해지는 지 알지 못한다 . 간단합니다! = 짧습니다.
Mike Graham

14
나는 더 많은 것을 지적려고 import os 하고 A는 import os.path만약 당신이 예를 들어 필요 바보입니다 os.getcwd()os.path.isfile()
닉 T

15

확실한 답변 : import os및 사용 os.path. import os.path직접 하지 마십시오 .

모듈 자체의 문서에서 :

>>> import os
>>> help(os.path)
...
Instead of importing this module directly, import os and refer to
this module as os.path.  The "os.path" name is an alias for this
module on Posix systems; on other systems (e.g. Mac, Windows),
os.path provides the same operations in a manner specific to that
platform, and is an alias to another module (e.g. macpath, ntpath).
...

13
os.path존재하지 않는 모듈에 대한 문서는 아니지만에 대한 문서 posixpath입니다.
wRAR

18
docstring은 해석이 잘못되었다고 생각하는 방식이 아닙니다. 문장이 있다는 사실을 숙지 "Instead of importing this module directly, import os and refer to this module as os.path."에 위치 posixpath.py(또는 macpath.py, ntpath.py등). 나는 그들이 의미하는 바가 import posixpath(작동하는) 것이 아니라 os더 나은 이식성 을 위해 모듈을 가져와야 한다는 것을 확신 합니다. 나는 그들이 선호 하는지 import os또는 import os.path선호 되는지에 대한 권장 사항을 제시하려고 생각하지 않습니다 .
flornquake 2016 년

1
나는 @flornquake의 의견 대부분에 동의하지만 마지막 문장에 동의하지 않습니다. posixpath.py 및 ntpath.py는 모두 "os 가져 오기 및이 모듈을 os.path로 참조"라고 말합니다. "os.path 가져 오기"라고 말하지 않고이 모듈을 os.path라고합니다. macpath.py에는 문제가 없습니다.
피트 포먼

3
이것은 this 포인터를 포함하는 문서가 어떻게 오도 ​​될 수 있는지 보여주는 좋은 예입니다 : D
Cyker

7

흥미롭게도 os.path를 가져 오면 모든 os를 가져옵니다. 대화식 프롬프트에서 다음을 시도하십시오.

import os.path
dir(os)

os를 가져온 것처럼 결과가 동일합니다. os.path는 사용중인 운영 체제에 따라 다른 모듈을 참조하기 때문에 파이썬은 os를 가져와 경로에로드 할 모듈을 결정합니다.

참고

일부 모듈의 경우 say import foo가 노출되지 않으므로 foo.bar특정 모듈의 디자인에 따라 달라집니다.


일반적으로 필요한 명시 적 모듈을 가져 오면 속도가 약간 빨라집니다. 내 컴퓨터에서 :

import os.path: 7.54285810068e-06

import os: 9.21904878972e-06

이시기는 무시할만한 수준에 가깝습니다. 프로그램은 os지금 또는 나중에 다른 모듈을 사용해야 할 수도 있으므로 일반적으로 2 마이크로 초를 희생하고 import os나중에이 오류를 피하기 위해 사용하는 것이 좋습니다. 나는 일반적으로 os를 전체적으로 가져 오는 것과 관련이 있지만, 일부는 import os.path기술적으로 더 효율적인 것을 선호 하고 os모듈 의 유일한 부분 인 코드 독자에게 전달 해야하는 이유를 알 수 있습니다. 그것은 본질적으로 내 생각에 스타일 질문으로 귀결됩니다.


2
from os import path속도가 문제인 경우 경로에 대한 통화가 훨씬 빨라집니다.
Justin Peel

pythonic, 명시 적 인 것이 암묵적 권리보다 낫습니까? 실제로 사용자가 os.path 만 사용하든 os 내 여러 모듈을 사용하든 실제로 사용자의 판단 요청이라고 생각합니다. 어쩌면 한 방법이 다른 방법보다 당신의 철학과 더 일치합니까?
Andrew Kou

23
타이밍 이것은 내가 본 것 중 가장 이른 조기 최적화 중 일부입니다. 이것은 아무도 병목 현상 이 없었으며 여기에서 시간은 누군가가 코드를 작성하는 방법에 중요하지 않습니다.
Mike Graham

5

상식은 여기에서 작동합니다. os모듈이고 os.path모듈이기도합니다. 따라서 사용하려는 모듈을 가져 오십시오.

  • os모듈 에서 기능을 사용하려면 을 가져 오십시오 os.

  • os.path모듈 에서 기능을 사용하려면 을 가져 오십시오 os.path.

  • 두 모듈 모두에서 기능을 사용하려면 두 모듈을 모두 가져 오십시오.

    import os
    import os.path

참고로 :


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