Пути 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)?

10
задан jww 24 August 2019 в 05:56
поделиться

7 ответов

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

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

Есть ли у вас веская причина не использовать функции os ?

os. on.

Это экспортирует: - все функции из 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', имеют больше шансов быть переносится между разными платформами. Конечно, они должны только тогда использовать функции, которые определены на всех платформах (например, отключение и opendir) и оставьте все манипуляции с путями для os.path (например, split и соединить).

6
ответ дан 3 December 2019 в 15:52
поделиться

Windows supports / as a path separator. The only incompatibilities between Unix filenames and Windows filenames are:

  • the allowed characters in filenames
  • the special names and
  • case sensitivity

Windows is more restrictive in the first two accounts (this is, it has more forbidden characters and more special names), while Unix is typically case sensitive. There are some answers here listing exactly what are these characters and names. I'll see if I can find them.

Now, if your development environment comes with a function to create or manipulate paths, you should use it, it's there for a reason, y'know. Especially given that there are a lot more platforms than Windows and Unix.

Answering your first question, yes ../dir/file will work, unless they hit some of the above mentioned incompatibilities.

3
ответ дан 3 December 2019 в 15:52
поделиться

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

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

1
ответ дан 3 December 2019 в 15:52
поделиться

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

0
ответ дан 3 December 2019 в 15:52
поделиться

Within python, using / will always work. You will need to be aware of the OS convention if you want to execute a command in a subshell

myprog = "/path/to/my/program"
os.system([myprog, "-n"])                           # 1
os.system([myprog, "C:/input/file/to/myprog"])      # 2

Command #1 will probably work as expected.
Command #2 might not work if myprog is a Windows command and expects to parse its command line arguments to get a Windows file name.

3
ответ дан 3 December 2019 в 15:52
поделиться

I've never had any problems with using .., although it might be a good idea to convert it to an absolute path using os.path.abspath. Secondly, I would recommend always using os.path.join whereever possible. There are a lot of corner cases (aside from portability issues) in joining paths, and it's good not to have to worry about them. For instance:

>>> '/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'

You may run into problems with using .. if you're on some obscure platforms, but I can't name any (Windows, *nix, and OS X all support that notation).

11
ответ дан 3 December 2019 в 15:52
поделиться

Он работает в Windows, поэтому, если вы определите "независимо от платформы" как Unix и Windows, все в порядке.

С другой стороны, Python также работает на VMS, RISC OS и других странных платформах, которые используйте совершенно другие соглашения об именах файлов. Однако вполне вероятно, что попытка заставить ваше приложение работать на VMS, вслепую, в любом случае выглядит глупо - «преждевременная переносимость - корень некоторого относительно незначительного зла»

. Мне в любом случае нравится использовать функции os.path, потому что они хорош для выражения намерения - вместо простого объединения строк, которое может быть выполнено для любого из миллиона целей, он читается очень явно как манипуляция с путями.

3
ответ дан 3 December 2019 в 15:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: