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

Могут ли все пути в программе Python использовать «..» (для родительского каталога) и / (для разделения компонентов пути) и все равно работать независимо от платформы ?

С одной стороны, я никогда не видел таких претензий в документации (возможно, я пропустил ее), а модули os и os.path предоставляют средства для обработки путей в агностическом режиме платформы (os.pardir, os.path. join, …), что позволяет мне думать, что они здесь по какой-то причине.

С другой стороны, вы можете прочитать в StackOverflow, что «../path/to/file» работает на всех платформах …

Итак, должны ли os.pardir, os.path.join и друзья всегда использоваться, для целей переносимости, или имена путей Unix всегда безопасны (вплоть до возможных проблем с кодировкой символов)? или, может быть, «почти всегда» безопасно (т.е. работает под Windows, OS X и Linux)?

7 Solutions collect form web for “Пути Unix: официально работайте в Python для любой платформы?”

«Почти всегда безопасно». Все платформы, о которых вы заботитесь, вероятно, хорошо работают сегодня, и я не думаю, что они скоро изменят свои соглашения.

Однако 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 is ' posix ',' nt ',' dos ',' os2 ',' mac 'или' ce '- os.curdir – это строка, представляющая текущий каталог ('. 'или': ') – os.pardir – это строка представляющий родительский каталог ('..' или '::') – os.sep является (или наиболее распространенным) разделителем пути ('/' или ':' или '\') – os.altsep – это альтернативный путь separator (None или '/') – os.pathsep – это разделитель компонентов, используемый в $ PATH и т. д. os.linesep – разделитель строк в текстовых файлах ('' или '' или '') – os.defpath – это поиск по умолчанию путь для исполняемых файлов

Программы, которые импортируют и используют «os», имеют больше шансов быть переносимыми между различными платформами. Разумеется, они должны использовать только функции, определенные всеми платформами (например, unlink и opendir), и оставлять все манипуляции с именем пути к 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 использование / всегда будет работать. Вам нужно знать о соглашении ОС, если вы хотите выполнить команду в подоболочке

 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 будет работать, если только они не ../dir/file некоторые из вышеупомянутых несовместимостей.

OS / X и Linux совместимы с Unix, поэтому по определению они используют формат, который вы дали в начале вопроса. Windows позволяет «/» в дополнение к «\», чтобы программы могли быть взаимозаменяемыми с Xenix, вариантом Unix, который Microsoft давно пыталась использовать, и эта совместимость переносилась в настоящее. Таким образом, он работает тоже.

Я не знаю, сколько других платформ Python было портировано, и я не могу говорить за них.

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

  • Как относиться к относительным путям ресурсов при работе с репозиторием кода в Python
  • Python - лучший язык программирования в мире.