os.path.join - могу ли я добиться согласованности между Windows и Cygwin?

Мне очень нужен набор компонентов для имен файлов, которые дадут мне согласованные и "красивые" имена файлов как в Windows, так и в Cygwin. Вот что я пробовал:

  Input                                Windows      Cygwin
1 os.path.join('c:', 'foo', 'bar')     c:foo\bar    c:/foo/bar
2 os.path.join('c:\\', 'foo', 'bar')   c:\foo\bar   c:\/foo/bar
3 os.path.join('c:/', 'foo', 'bar')    c:/foo\bar   c:/foo/bar

1 - это не то, что мне нужно в Windows, мне нужен абсолютный путь, а не относительно текущего каталога.

2 и 3 работают, но не работают (настоящим я определяю ) "красивый" так как они смешивают прямые и обратные косые черты на одной или другой платформе. Мои сообщения об ошибках и журналы будут более удобочитаемыми, если я смогу этого избежать.

Вариант 4 - определить для себя переменную rootroot , равную c: \ в Windows и / cygdrive / c на Cygwin. Или функция, которая берет букву диска и возвращает ее. Но я также предпочел бы избегать особых случаев для каждой платформы между этими двумя.

Могу ли я получить все, что захочу (присоединить идентичные компоненты пути, чтобы получить результат, который относится к одному и тому же абсолютному пути на обе платформы, и не смешивает разделители путей на обеих платформах)? Или мне нужно пойти на компромисс?

Вариант 4 - определить для себя переменную rootroot , равную c: \ в Windows и / cygdrive / c в Cygwin. Или функция, которая берет букву диска и возвращает ее. Но я также предпочел бы избегать особых случаев для каждой платформы между этими двумя.

Могу ли я получить все, что захочу (объединить идентичные компоненты пути, чтобы получить результат, который ссылается на тот же абсолютный путь на обе платформы, и не смешивает разделители путей на обеих платформах)? Или мне нужно пойти на компромисс?

Вариант 4 - определить для себя переменную rootroot , равную c: \ в Windows и / cygdrive / c в Cygwin. Или функция, которая берет букву диска и возвращает ее. Но я также предпочел бы избегать особых случаев для каждой платформы между этими двумя.

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

Могу ли я получить все, что хочу (объединить компоненты идентичного пути, чтобы получить результат, который ссылается на один и тот же абсолютный путь на обеих платформах и не смешивает разделители путей на обеих платформах)? Или мне нужно пойти на компромисс?

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

[Edit: в случае, если это помогает, основной вариант использования состоит в том, что c: \ foo - это путь, о котором я знаю во время настройки, тогда как bar (и другие компоненты ) вычисляются позже. Итак, мой реальный код в настоящее время выглядит примерно так:

dir = os.path.join('c:\\', 'foo')

# some time later

os.path.join(dir, 'bar')

Здесь используется вариант 2, который приводит к "хорошему" сообщению имен файлов в Windows, но "не хорошему" сообщению имен файлов в Cygwin. Чего я хочу избежать, если это возможно:

if this_is_cygwin():
    dir = '/cygdrive/c/foo'
else:
    dir = 'c:\\foo'

]

5
задан Steve Jessop 12 May 2011 в 12:16
поделиться