[python] 이 경우 os.path.join ()이 작동하지 않는 이유는 무엇입니까?

아래 코드는 디버그 할 때 명령이 전체 경로를 저장하지 않고 마지막 항목 만 저장하지 않습니다.

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')