아래 코드는 디버그 할 때 명령이 전체 경로를 저장하지 않고 마지막 항목 만 저장하지 않습니다.
os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')
이것을 테스트 할 때 /new_sandbox/
코드 의 일부만 저장합니다 .
답변
후자의 문자열은 슬래시로 시작해서는 안됩니다. 슬래시로 시작하면 “절대 경로”로 간주되며 그 이전의 모든 항목은 삭제됩니다.
파이썬 문서os.path.join
인용 :
구성 요소가 절대 경로 인 경우 이전의 모든 구성 요소가 버리고 절대 경로 구성 요소에서 결합이 계속됩니다.
Windows에서 드라이브 문자와 관련된 동작은 이전 Python 버전과 비교하여 변경된 것으로 보입니다.
Windows에서 절대 경로 구성 요소 (예 🙂
r'\foo'
가 발생 하면 드라이브 문자가 재설정되지 않습니다 . 구성 요소에 드라이브 문자가 포함되어 있으면 이전의 모든 구성 요소가 버리고 드라이브 문자가 재설정됩니다. 각 드라이브os.path.join("c:", "foo")
에 대한 현재 디렉토리가 있으므로 ,가 아닌 드라이브C:
(c:foo
) 의 현재 디렉토리에 상대적인 경로를 나타냅니다c:\foo
.
답변
아이디어는 os.path.join()
프로그램을 크로스 플랫폼 (linux / windows / etc)으로 만드는 것입니다.
슬래시조차도 그것을 망칩니다.
같은 기준점의 일종으로 사용되는 경우에만 의미가 그래서
os.environ['HOME']
나 os.path.dirname(__file__)
.
답변
os.path.join()
os.path.sep
상대 경로가 아닌 절대 경로를 만들기 위해 함께 사용할 수 있습니다 .
os.path.join(os.path.sep, 'home','build','test','sandboxes',todaystr,'new_sandbox')
답변
루트 디렉토리를 참조 할 때를 제외하고 경로 구성 요소의 시작 부분에 슬래시를 사용하지 마십시오.
os.path.join('/home/build/test/sandboxes', todaystr, 'new_sandbox')
참조 : http://docs.python.org/library/os.path.html#os.path.join
답변
이 놀라운 동작이 완전히 끔찍한 이유를 이해하려면 구성 파일 이름을 인수로 사용하는 응용 프로그램을 고려하십시오.
config_root = "/etc/myapp.conf/"
file_name = os.path.join(config_root, sys.argv[1])
응용 프로그램이 다음과 같이 실행되는 경우 :
$ myapp foo.conf
구성 파일 /etc/myapp.conf/foo.conf
이 사용됩니다.
그러나 애플리케이션이 다음과 같이 호출되면 어떻게되는지 고려하십시오.
$ myapp /some/path/bar.conf
그 다음 myapp
해야 에 설정 파일을 사용 /some/path/bar.conf
(그리고 /etc/myapp.conf/some/path/bar.conf
또는 이와 유사한 것).
그것은 좋지 않을 수도 있지만 이것이 절대 경로 행동의 동기라고 생각합니다.
답변
왜냐하면 당신 '/new_sandbox/'
은 a로 시작 /
해서 루트 디렉토리에 상대적인 것으로 가정하기 때문입니다. 선행을 제거하십시오 /
.
답변
기능을보다 이식 가능하게하려면 다음과 같이 사용하십시오.
os.path.join(os.sep, 'home', 'build', 'test', 'sandboxes', todaystr, 'new_sandbox')
또는
os.path.join(os.environ.get("HOME"), 'test', 'sandboxes', todaystr, 'new_sandbox')