[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__))
그러나 그것은 False
Windows 기계에 있습니다.
답변
Windows 경로에 가입하려면
mypath=os.path.join('c:\\', 'sourcedir')
기본적으로 슬래시를 이스케이프해야합니다.