Пути Unix:официально работаете на Python для любой платформы?
-
06-07-2019 - |
Вопрос
Могут ли все пути в программе Python использовать ".." (для родительского каталога) и / (для разделения компонентов пути) и все еще работать какой бы ни была платформа?
С одной стороны, я никогда не видел такого утверждения в документации (возможно, я это пропустил), а модули os и os.path предоставляют средства для обработки путей независимо от платформы (os.pardir, os.path.join, ...), что позволяет мне думать, что они здесь не просто так.
С другой стороны, вы можете читайте о StackOverflow что "../путь/к / файлу" работает на всех платформах…
Итак, следует ли всегда использовать os.pardir, os.path.join и friends в целях переносимости, или имена путей в Unix всегда безопасны (вплоть до возможных проблем с кодировкой символов)?или, может быть, "почти всегда" безопасно (т.е.работает под управлением Windows, OS X и Linux)?
Решение
" Почти всегда безопасно " правильно. Все платформы, о которых вы заботитесь, вероятно, сегодня работают нормально, и я не думаю, что они изменят свои соглашения в ближайшее время.
Тем не менее, Python очень переносим и работает намного больше, чем обычные платформы. Причина для модуля os
состоит в том, чтобы помочь сгладить все, что есть у платформы.
Есть ли у вас веская причина не использовать функции os
?
os.pardir
самодокументируется, тогда как " .. "
нет, и os.pardir может быть проще для grep для
Вот несколько документов из Python 1.6, когда Mac все еще отличался
Подпрограммы ОС для Mac, DOS, NT или Posix в зависимости от того, какую систему мы используем на.
Этот экспорт: - все функции из posix, nt, dos, os2, mac или ce, например, unlink, stat и т. д. os.path - это один из модулей posixpath, ntpath, macpath или dospath os.name - это «posix», «nt», «dos», «os2», «mac» или «ce» os.curdir - это строка, представляющая текущий каталог ('.' или ':') os.pardir - это строка, представляющая родительский каталог ('..' или '::') os.sep является (или наиболее распространенным) разделителем пути ('/' или ':' или '\') os.altsep - разделитель альтернативных путей (нет или '/') os.pathsep - это разделитель компонентов, используемый в $ PATH и т. д. os.linesep - разделитель строк в текстовых файлах ('' или '' или '') os.defpath - это путь поиска по умолчанию для исполняемых файлов
Программы, которые импортируют и используют 'os', имеют больше шансов быть портативный между различными платформами. Конечно, они должны только тогда использовать функции, которые определены всеми платформами (например, unlink и opendir) и оставьте все манипуляции с именами путей к os.path (например, split и присоединяйтесь).
Другие советы
У меня никогда не было проблем с использованием ..
, хотя было бы неплохо преобразовать его в абсолютный путь, используя 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 использование /
всегда будет работать. Вам нужно знать соглашение об ОС, если вы хотите выполнить команду в подоболочке
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, вслепую, в любом случае глупо - «преждевременная переносимость является корнем некоторого относительно небольшого зла»
Мне все равно нравится использовать функции os.path, потому что они хороши для выражения намерений - вместо простой конкатенации строк, которая может быть сделана для любой из миллионов целей, она очень явно читается как манипулирование путями.
Поддержка Windows /
в качестве разделителя путей.Единственными несовместимостями между именами файлов Unix и Windows являются:
- допустимые символы в именах файлов
- особые названия и
- чувствительность к регистру
Windows более ограничительна в первых двух учетных записях (это означает, что в нем больше запрещенных символов и больше специальных имен), в то время как Unix обычно чувствителен к регистру.Есть некоторые ответы здесь перечислено, что именно представляют собой эти персонажи и имена.Я посмотрю, смогу ли я их найти.
Теперь, если ваша среда разработки поставляется с функцией для создания путей или манипулирования ими, вы должны использовать ее, вы знаете, она существует не просто так.Особенно учитывая, что существует гораздо больше платформ, чем Windows и Unix.
Отвечая на ваш первый вопрос, да ../dir/file
будут работать, если только они не столкнутся с некоторыми из вышеупомянутых несовместимостей.
OS / X и Linux совместимы с Unix, поэтому по определению они используют формат, который вы указали в начале вопроса. Windows позволяет " / " в дополнение к " \ " чтобы программы могли быть взаимозаменяемыми с Xenix, вариантом Unix, который Microsoft уже давно опробовал, и эта совместимость была перенесена в настоящее время. Таким образом, это тоже работает.
Я не знаю, сколько других платформ было портировано на Python, и я не могу говорить за них.
Как уже говорили другие, косая черта будет работать во всех случаях, но вам лучше создать список сегментов пути и os.path.join () - их.