Разрешаване на смесени наклонени черти от sys.path и os.path.join

Трябва да разреша несъответствието между разделителя, който sys.path предоставя, и разделителя, който os.path.join използва.

Имитирах този метод на Esri (Техники за споделяне на Python скриптове), за да направя моя скрипт преносим. Засега се използва в Windows, но в крайна сметка ще живее на Linux сървър; Трябва да позволя на Python да определи подходящата наклонена черта.

Какво предлагат:

# 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 на прозорци) включва основния подход към решение:

проверете външния си вход (входа, чийто формат очевидно не контролирате), преди да го поставите в os.path.join. По този начин се уверявате, че os.path.join не взема лоши решения въз основа на евентуално лош вход

Въпреки това не съм сигурен как да гарантирам, че ще работи на различни платформи. Ако използвам .replace("/","\\") за резултата sys.path[0], това е страхотно за Windows, но няма ли това да причини същия проблем със смесени наклонени черти, след като премина към Unix?


person Erica    schedule 03.09.2014    source източник
comment
pathlib опция ли е? Това е ново в Python 3.4 и не съществува в Python 2.7.   -  person chepner    schedule 03.09.2014
comment
Мисля, че съм останал с Python 2.7 поради куп функции на ArcPy, които използвам (и/или имаме само 2.7 на сървъра).   -  person Erica    schedule 03.09.2014
comment
Python може да използва наклонени черти за пътеки на Windows, така че sys.path[0].replace(r'\', '/') може да е най-добрият вариант за междуплатформена функционалност.   -  person chepner    schedule 03.09.2014


Отговори (3)


Какво ще кажете да използвате os.path.normpath()?

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

Също така си струва да се спомене: API за пътя на Windows не се интересува дали се използват наклонени черти напред или назад. Обикновено грешката е в програмата, която не обработва правилно нарязването. Например в python:

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

ще работи.

person OozeMeister    schedule 05.09.2014

След прочитане на документацията и изпробване на много вариации:

Функцията 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

person Erica    schedule 03.09.2014
comment
Прочетете внимателно тази документация: На повечето платформи това е еквивалентно на извикването на функцията normpath() .... Просто извикайте os.path.normpath() директно, освен ако не трябва да направите пътя абсолютен. - person Martijn Pieters; 26.11.2018

В Python има знак os.sep, който съхранява предпочитания знак за разделяне на папки на вашата операционна система. Може би бихте могли да изпълните ръчен низ join като използвате това?

Под Linux:

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

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

person TheSoundDefense    schedule 03.09.2014
comment
Проблемът е, че os.sep (в Windows, обратна наклонена черта) не съвпада с това, което sys.path[0] използва (наклонена черта). Може да работи на Linux (не съм проверил), но бих искал да работи чисто и на двете платформи. - person Erica; 03.09.2014