Пути Unix:официально работаете на Python для любой платформы?

StackOverflow https://stackoverflow.com/questions/1633643

Вопрос

Могут ли все пути в программе 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 () - их.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top