2009-10-27 3 views
9

파이썬 프로그램의 모든 경로는 ".."(상위 디렉토리의 경우) 및/(경로 구성 요소 분리의 경우)를 사용할 수 있으며 어떤 플랫폼이든간에 을 계속 사용할 수 있습니까??유닉스 경로 : 공식적으로 모든 플랫폼에서 파이썬으로 작업합니까?

한편으로 나는 문서에서 그런 주장을 보지 못했고 (필자가 놓쳤을 수도 있음), os 및 os.path 모듈은 플랫폼에 독립적 인 방식으로 경로를 처리 할 수있는 기능을 제공합니다 (os.pardir, os.path.join, ...), 나는 그들이 여기에 이유가 있다고 생각하게 해줍니다. 한편

, 당신은 "../path/to/file는"모든 플랫폼에서 작동 read on StackOverflow ...

그래서, os.pardir해야 할 수 os.path.join 항상 사용 친구, 이식성을 위해 또는 유닉스 경로명이 항상 안전합니까 (가능한 문자 인코딩 문제까지)? 또는 거의 항상 안전 할 수 있습니다 (예 : Windows, OS X 및 Linux에서 작동)?

+4

Windows와 관련해서는 전혀 문제가 없었습니다. – jldupont

답변

6

"거의 항상 안전하다"는 말이 맞습니다. 걱정하는 플랫폼은 모두 오늘 괜찮아 질 것입니다. 그리고 나는 그들이 언제든지 그들의 관행을 바꿀 것이라고 생각하지 않습니다.

그러나 파이썬은 매우 이식성이 뛰어나며 일반적인 플랫폼보다 훨씬 더 많이 실행됩니다. os 모듈의 이유는 플랫폼이 다른 요구 사항을 가지고 있기 때문에 원활한 작업을 돕기 위해서입니다.

당신이 os 기능을 사용하지 않도록위한 좋은 이유가 있나요? 맥은 여전히 ​​

OS 루틴 모두를위한 다른 때 파이썬 1.6에서 일부 문서입니다 ".."가 아닌 반면

os.pardir

자기 문서화하고, os.pardir 여기

에 대한 grep을하는 것이 더 쉬울 수 있습니다 Mac, DOS, NT 또는 Posix의 경우 어떤 시스템이 우리가 인지에 따라 다릅니다.

이 수출 : - POSIX의 모든 기능, NT, DOS, OS2, Mac 또는 CE, 예를 들어, 해제, 합계 등 -을 os.path가 ntpath가 macpath 또는 dospath 모듈의 posixpath의 하나이다 - os.name가 'POSIX', 'NT', 'DOS', 'OS2', 'MAC'이며 ('..'또는 '::') - os.curdir은 현재 디렉토리 ('.'또는 ':')를 나타내는 문자열입니다. - os.pardir은 상위 디렉토리를 나타내는 문자열입니다 ('..'또는 '::') - os.sep는 (또는 가장 일반적인) 경로명 분리 기호 ('/'또는 ':'또는 '\')입니다. - os.altsep는 대체 경로 이름 구분 기호입니다 (없음 또는 '/'). - os.pathsep는 $ PATH 등에서 사용되는 구성 요소 구분자 - os.linesep는 텍스트 파일의 줄 구분 기호입니다 (" '또는' '또는' ') - os.defpath는 실행 파일의 기본 검색 경로입니다.

'os'를 가져오고 사용하는 프로그램은 다른 플랫폼간에 휴대하기가 더 좋은 일 수 있습니다. 물론 그들은 함수 만 사용하여 모든 플랫폼에서 정의 된 함수 (예 : unlink 및 opendir)를 사용해야하며 모든 경로 이름 조작을 os.path (예 :, 균열 및 가입).

+0

os.path와 co.를 우회하는 것을 생각한 이유. os.pardir, [ 'dir1', 'dir2', 'dir3', 'file (')을 사용하는 대신에 "../dir1/dir2/dir3/file"을 쓰는 것이 더 간단하고 명확하다는 것입니다. '])! – EOL

+0

@EOL 나는 그것을 필요로하는 너무 많은 실제 프로그램을 생각할 수 없다. 아마 그것과 같은 경로를 설정 파일로 옮기는 것이 합리적 일 것입니다. –

+0

@gnibbler 내 프로그램은 수천 개의 데이터 세트를 분석하고 각 데이터 세트의 "이름"에서 디렉토리 이름을 계산하는 일반적인 위치에 결과를 저장합니다. 하지만 예, os.path.join (os.pardir, ...)은 직접 경로 코딩과 거의 비슷합니다. – EOL

1

OS/X와 Linux는 모두 Unix와 호환되므로 정의에 따라 질문의 시작 부분에서 지정한 형식을 사용합니다. Windows는 "\"이외에도 "\"를 허용하여 프로그램이 Xenix와 호환 될 수 있도록했습니다. 이는 Microsoft가 오래전에 시도했던 Unix 계열이며 호환성이 현재까지 계속되었습니다. 따라서 그것은 또한 작동합니다.

파이썬이 얼마나 많은 다른 플랫폼에 이식되었는지는 알 수 없으며 말할 수 없습니다.

3

파이썬에서 /을 사용하면 항상 작동합니다. 서브 쉘에서 명령을 실행하려면 OS 규칙을 알아야합니다.

myprog = "/path/to/my/program" 
os.system([myprog, "-n"])       # 1 
os.system([myprog, "C:/input/file/to/myprog"])  # 2 

명령 1이 예상대로 작동합니다.
myprog이 Windows 명령이고 해당 명령 줄 인수를 구문 분석하여 Windows 파일 이름을 가져 오는 경우 명령 2가 작동하지 않을 수 있습니다.

+1

단지 참고 사항 - 프로그램을 실행하기 위해'os.system'을 사용하지 마십시오. 그것은 문자열 (당신이 사용한리스트가 아닌)을 필요로하며 불필요하게 쉘을 호출합니다. 'subprocess' 모듈을 대신 사용하십시오. – nosklo

3

Windows는 경로 구분 기호로 /을 지원합니다. 유닉스 파일 이름 및 Windows 파일 이름의 유일한 비 호환성은 다음과 같습니다 파일 이름에

  • 허용 된 문자
  • 특별한 이름과
  • 대소 문자 구분

Windows is more restrictive in the first two accounts (이 더 금지 된 문자가있다 그리고 더 특별한 이름), Unix는 일반적으로 대소 문자를 구분합니다. answers에는 정확히 이러한 문자와 이름이 나열되어 있습니다. 내가 그들을 찾을 수 있는지 알게 될거야.

이제 개발 환경에 경로를 만들거나 조작하는 기능이있는 경우이를 사용해야합니다. 이유가 있습니다. 특히 Windows와 Unix보다 더 많은 플랫폼이 있다는 점을 감안할 때.

위에서 언급 한 비 호환성 중 일부가 발생하지 않는 한 첫 번째 질문에 yes로 대답하면 yes ../dir/file이 작동합니다.

+0

대소 문자 구분의 차이점을 잊지 마십시오. –

11

os.path.abspath을 사용하여 절대 경로로 변환하는 것이 좋을지 모르지만 ..을 사용하는 데 전혀 문제가 없었습니다. 둘째, 항상 os.path.join을 사용하는 것이 좋습니다.경로에 참여할 때 많은 이식성 문제 (이식성 문제 제외)가 있으며 걱정할 필요가 없습니다. 예를 들어 :

>>> '/foo/bar/' + 'qux' 
'/foo/bar/qux' 
>>> '/foo/bar' + 'qux' 
'/foo/barqux' 
>>> from os.path import join 
>>> join('/foo/bar/', 'qux') 
'/foo/bar/qux' 
>>> join('/foo/bar', 'qux') 
'/foo/bar/qux' 

당신은 당신이 어떤 모호한 플랫폼 인 경우 ..을 사용하여 문제가 실행할 수 있습니다,하지만 난 어떤 이름을 수 없습니다 (윈도우, * nix에서 스크립트, 그리고 OS X 모두 표기하는 것이 지원).

3

Windows에서 작동하므로 "플랫폼이 무엇이든간에"Unix 및 Windows로 정의하면 아무 문제가 없습니다. 한편

는, 파이썬은 VMS, RISC OS, 완전히 다른 파일 이름 규칙을 사용하는 다른 이상한 플랫폼에서 실행됩니다. 그러나 VMS에서 실행되도록 응용 프로그램을 만들려고 시도하는 것이 어리석은 일입니다. "조기 이식성은 상대적으로 사소한 악의 뿌리입니다.

어쨌든 os.path 함수를 사용하는 것이 좋습니다. 의도를 표현하는 데 적합합니다. 100 만 가지 목적으로 수행 될 수있는 문자열 연결 대신 경로 조작으로 매우 명확하게 읽습니다. 다른 사람이 말했듯이

0

, 슬래시는 모든 경우에 작동하지만 경로 세그먼트와 os.path.join의 목록() 만드는 것이 더 낫다 -를 보내고 있습니다.

관련 문제