[python] Windows의 Python os.path.join

나는 파이썬을 배우려고 노력하고 있으며 스크립트를 출력하는 프로그램을 만들고 있습니다. os.path.join을 사용하고 싶지만 꽤 혼란 스럽습니다. 내가 말하는 경우 문서 에 따르면 :

os.path.join('c:', 'sourcedir')

나는 "C:sourcedir". 문서에 따르면 이것은 정상입니다.

그러나 copytree 명령을 사용하면 Python이 원하는 방식으로 출력합니다. 예를 들면 다음과 같습니다.

import shutil
src = os.path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)

내가 얻는 오류 코드는 다음과 같습니다.

WindowsError : [Error 3] 지정한 경로를 찾을 수 없습니다 : 'C : src /*.*'

os.path.join와 함께 포장하면 os.path.normpath동일한 오류가 발생합니다.

os.path.join이런 식으로 사용할 수 없다면 그 목적이 혼란 스럽습니다.

Stack Overflow에서 제안한 페이지에 따르면 조인에 슬래시를 사용해서는 안됩니다. 맞습니다.



답변

Windows에는 각 드라이브에 대한 현재 디렉토리 개념이 있습니다. 따라서 "c:sourcedir"현재 C : 디렉토리 내부의 “sourcedir”을 의미하며 절대 디렉토리를 지정해야합니다.

이들 중 어느 것이 든 작동하고 동일한 결과를 제공해야하지만, 현재 다시 확인하기 위해 Windows VM을 실행하지 않았습니다.

"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")


답변

더 현명하게 말하면 가장 파이썬 문서 일관된 대답은 다음과 같습니다.

mypath = os.path.join('c:', os.sep, 'sourcedir')

posix 루트 경로에 os.sep도 필요하기 때문에 :

mypath = os.path.join(os.sep, 'usr', 'lib')


답변

이유 os.path.join('C:', 'src')링크 된 문서의 내용이 예상대로 작동하지 않는 는 다음과 같습니다.

Windows에서는 각 드라이브에 대한 현재 디렉토리가 있으므로 os.path.join ( “c :”, “foo”)는 c가 아닌 C : (c : foo) 드라이브의 현재 디렉토리에 상대적인 경로를 나타냅니다. : \ foo.

ghostdog가 말했듯이, 당신은 아마도 mypath=os.path.join('c:\\', 'sourcedir')


답변

Windows와 Linux 모두에서 작동하는 시스템에 구애받지 않는 솔루션의 경우 입력 경로에 관계없이 다음을 사용할 수 있습니다. os.path.join(os.sep, rootdir + os.sep, targetdir)

WIndows :

>>> os.path.join(os.sep, "C:" + os.sep, "Windows")
'C:\\Windows'

Linux의 경우 :

>>> os.path.join(os.sep, "usr" + os.sep, "lib")
'/usr/lib'


답변

현명하게 말하면 경로 구분자로 / 또는 \를 하드 코딩하는 것은 좋지 않을 것입니다. 아마도 이것이 최선일까요?

mypath = os.path.join('c:%s' % os.sep, 'sourcedir')

또는

mypath = os.path.join('c:' + os.sep, 'sourcedir')


답변

나는 이것이 (windows) python 버그라고 말하고 싶습니다.

왜 버그인가?

이 진술은 True

os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))

그러나 그것은 FalseWindows 기계에 있습니다.


답변

Windows 경로에 가입하려면

mypath=os.path.join('c:\\', 'sourcedir')

기본적으로 슬래시를 이스케이프해야합니다.