문제

Python 프로그램의 모든 경로가 "(부모 디렉토리의 경우) 및 / (경로 구성 요소 분리)를 사용할 수 있으며 여전히 작동 할 수 있습니다. 플랫폼이 무엇이든?

한편으로, 나는 문서에서 그러한 주장을 본 적이 없으며 (나는 그것을 놓쳤을 수도 있음) OS 및 OS.Path 모듈은 플랫폼의 적절한 방식으로 경로를 처리 할 수있는 시설을 제공합니다 (OS.Pardir, OS.Path. 가입,…), 그들이 이유가 있기 때문에 여기에 있다고 생각할 수 있습니다.

반면에, 당신은 할 수 있습니다 stackoverflow에서 읽으십시오 그 "../path/to/file"은 모든 플랫폼에서 작동합니다…

그렇다면 os.pardir, os.path.join 및 친구가 항상 휴대 할 수있는 목적으로 사용되거나 Unix 경로 이름이 항상 안전해야합니까 (가능한 캐릭터 인코딩 문제)? 아니면 "거의 항상"안전 (예 : Windows, OS X 및 Linux에서 작업)?

도움이 되었습니까?

해결책

"거의 항상 안전"이 옳습니다. 당신이 관심을 갖는 모든 플랫폼은 아마도 오늘은 잘 작동 할 것이며, 나는 그들이 곧 컨벤션을 바꿀 것이라고 생각하지 않습니다.

그러나 파이썬은 매우 휴대 성이 뛰어나며 일반적인 플랫폼보다 훨씬 더 많이 실행됩니다. 그 이유 os 모듈은 플랫폼이 다른 요구 사항을 갖는 것을 부드럽게하는 데 도움이됩니다.

당신이 사용하지 않는 좋은 이유가 있습니까? os 기능?

os.pardir 자체 문서화입니다 ".." 그렇지 않습니다. os.pardir는

Mac이 여전히 다른 경우 Python 1.6의 일부 문서는 다음과 같습니다.

우리가 어떤 시스템에 있는지에 따라 Mac, Dos, NT 또는 Posix의 OS 루틴.

이 내보내기 : - Posix, NT, Dos, OS2, Mac 또는 CE, 예를 들어, Unlink, STAT 등의 모든 기능 - OS.Path는 PosixPath, NTPath, MacPath 또는 DOSPATH -OS.Name IS '입니다. posix ','nt ','dos ','os2 ','mac '또는'ce ' - os.curdir는 현재 디렉토리를 나타내는 문자열입니다 ('. '또는': ') - os.pardir는 문자열입니다. 부모 디렉토리 ( '..'또는 '::') - os.sep는 (또는 가장 일반적인) PathName 분리기 ( '/'또는 ':'또는 '') - os.altsep입니다. Separator (없음 또는 '/') - OS.PathSep는 $ 경로 등에 사용되는 구성 요소 분리기입니다. OS.Linesep은 텍스트 파일의 선 분리기입니다 ( ''또는 ''또는 '') - OS.DefPath는 기본 검색입니다. 실행 파일을위한 경로

'OS'를 가져오고 사용하는 프로그램은 다른 플랫폼 사이에서 휴대 할 가능성이 더 높습니다. 물론, 그들은 모든 플랫폼 (예 : Unlink 및 Opendir)에 의해 정의 된 함수 만 사용하고 모든 PathName 조작을 OS.Path (예 : Split 및 Join)에 두어야합니다.

다른 팁

사용하는 데 아무런 문제가 없었습니다 .., 그것을 사용하여 절대 경로로 변환하는 것이 좋습니다. 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'

사용과 관련하여 문제가 발생할 수 있습니다 .. 모호한 플랫폼에 있지만 이름을 지정할 수는 없습니다 (Windows, *Nix 및 OS X는 해당 표기법을 모두 지원합니다).

Python 내에서 사용 / 항상 작동합니다. 서브 쉘에서 명령을 실행하려면 OS 컨벤션을 알고 있어야합니다.

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

명령 #1은 아마도 예상대로 작동 할 것입니다.
명령 #2는 작동하지 않을 수 있습니다 myprog Windows 명령이며 Windows 파일 이름을 얻기 위해 명령 줄 인수를 구문 분석 할 것으로 기대합니다.

Windows에서 작동하므로 Unix와 Windows로 "플랫폼"을 정의하면 괜찮습니다.

반면, Python은 VMS, RISC OS 및 완전히 다른 파일 이름 규칙을 사용하는 기타 홀수 플랫폼에서도 실행됩니다. 그러나 VMS, Blind에서 응용 프로그램을 실행하려고하는 것은 어쨌든 어리석은 일입니다. "조기 휴대 성은 상대적으로 사소한 악의 근본입니다"

나는 OS.Path 함수를 사용하는 것을 좋아합니다.

Windows가 지원합니다 / 경로 분리기로. Unix 파일 이름과 Windows 파일 이름의 유일한 비 호환성은 다음과 같습니다.

  • 파일 이름의 허용 문자
  • 특별한 이름과
  • 케이스 감도

Windows는 처음 두 계정에서 더 제한적입니다 (이것은 더 금지 된 캐릭터와 더 특별한 이름을 가지고 있지만, UNIX는 일반적으로 사례에 민감합니다. 일부가 있습니다 답변 여기에는이 문자와 이름이 무엇인지 정확히 나열합니다. 내가 찾을 수 있는지 볼게요.

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

첫 번째 질문에 대답합니다 ../dir/file 위에서 언급 한 비 호환성 중 일부에 부딪치지 않는 한 작동합니다.

OS/X와 Linux는 모두 UNIX 호환이므로 정의상 질문의 시작 부분에서 제공 한 형식을 사용합니다. Windows는 ""외에 ""외에도 ""를 허용하므로 Microsoft가 오랫동안 시도한 UNIX 변형 인 Xenix와 교환 할 수 있으며 호환성이 현재로 전달되었습니다. 따라서 그것은 또한 작동합니다.

나는 Python이 얼마나 많은 다른 플랫폼을 포착했는지 모르겠다. 그리고 나는 그것들을 위해 말할 수 없다.

다른 사람들이 말했듯이, 전진 슬래시는 모든 경우에 작동하지만 경로 세그먼트 및 os.path.join () 목록을 만드는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top