2014-09-03 104 views
0

sys.path가 제공하는 구분 기호와 os.path.join이 사용하는 구분 기호 사이의 불일치를 해결해야합니다.sys.path와 os.path.join의 혼합 슬래시 해결

필자의 스크립트를 이식 할 수 있도록이 Esri 방법 ​​(Techniques for sharing Python scripts)을 흉내 냈습니다. 그것은 현재 Windows에서 사용되고 있지만 결국 Linux 서버에 살게됩니다. 파이썬이 적절한 슬래시를 결정하도록해야합니다.

는 그들이 제안하는 무엇 :

# Get the pathname to this script 
scriptPath = sys.path[0] 

# Get the pathname to the ToolShare folder 
toolSharePath = os.path.dirname(scriptPath) 

# Now construct pathname to the ToolData folder 
toolDataPath = os.path.join(toolSharePath, "ToolData") 
print "ToolData folder: " + toolDataPath 

하지만이 ToolData folder: C:/gis\ToolData를 출력 - 분명히 혼합 슬래시가 작동하지 않을 수 있습니다.

os.path.join에 넣어 전에 외부 입력 (당신은 분명히의 형식을 제어하지 않는 입력) 확인 :

이 질문 (mixed slashes with os.path.join on windows)는 솔루션에 대한 기본적인 접근 방식을 포함합니다. 이 방법을 사용하면 os.path.join이 나쁜 입력을 기반으로 나쁜 결정을하지 않음을 확인하십시오.

그러나 크로스 플랫폼에서 작동하는지 확실하지 않습니다. 을 sys.path[0] 결과에 사용하면 Windows 용으로 좋지만 Unix로 전환하면 동일한 혼합 슬래시 문제가 발생하지 않습니다.

+0

'pathlib '옵션이 있습니까? 이것은 Python 3.4에서 새로 추가되었으며 Python 2.7에서는 존재하지 않습니다. – chepner

+0

내가 사용하는 ArcPy 함수가 많기 때문에 파이썬 2.7에 머물렀다. (그리고/또는 우리는 서버에 2.7을 가지고있다.) – Erica

+0

파이썬은 Windows 경로에 슬래시를 사용할 수 있으므로'sys.path [0] .replace (r '\', '/')'는 플랫폼 간 기능에 가장 적합 할 수 있습니다. – chepner

답변

1
reading the documentation

과 변화를 많이 시도 :

os.path.abspath 기능 슬래시 수있다 "깨끗한", 그래서 어느 방향 sys.path[0] 슬래시가 사용하기로 결정을 , 슬래시가 기본 구분 기호로 바뀝니다.

scriptPath = sys.path[0] 
toolDataPath = os.path.join(scriptPath, "ToolData") 

결과 : C:/gis\ToolData

scriptPath = sys.path[0] 
toolSharePath = os.path.abspath(scriptPath) 
# or, in one line: toolSharePath = os.path.abspath(sys.path[0]) 
toolDataPath = os.path.join(toolSharePath, "ToolData") 

결과 : C:\gis\ToolData

0

OS의 기본 폴더 분리 문자를 저장하는 Python에는 os.sep 문자가 있습니다. 아마도 수동 문자열 join을 사용하여이를 수행 할 수 있습니까? 리눅스에

:

>>> import os 
>>> os.sep 
'/' 

https://docs.python.org/2/library/os.html#os.sep

+2

문제는'os.sep' (Windows에서는 백 슬래시)가'sys.path [0]'이 사용하는 것과 일치하지 않는다는 것입니다 (슬래시). 그것은 리눅스에서 할 수도 있지만 (체크하지 않았다), 나는 그것이 어느 플랫폼에서나 깨끗하게 작동되기를 바랄 것이다. – Erica

1

어떻게 os.path.normpath() 사용에 대한?

>>> import os 
>>> os.path.normpath(r'c:\my/path\to/something.py') 
'c:\\my\\path\\to\\something.py' 

또한 언급할만한 가치가 있습니다. Windows 경로 API는 앞으로 또는 뒤로 슬래시가 사용되는지 여부에 상관하지 않습니다. 일반적으로 제대로 슬래시를 처리하지 못하는 프로그램의 잘못입니다. 예를 들어, 파이썬에서 :

with open(r'c:/path/to/my/file.py') as f: 
    print f.read() 

이 작동합니다.