Мне очень нужен набор компонентов для имен файлов, которые дадут мне согласованные и "красивые" имена файлов как в 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'
]