Я пытаюсь использовать pysftp
с внешним сервером Linux, но когда я пытаюсь объединить пути и имена файлов, используя os.path.join()
или pathlib.Path()
, они по умолчанию по умолчанию используют локальный (Windows) разделитель пути \\
,'/'.join()
добивается цели, но не похоже на правильный ответ, но может быть лучшим решением.
import os
from pathlib import Path, PosixPath
os.path.join('path', 'to', 'file.txt')
# path\to\file.txt -- Windows
Path('path') / 'to' / 'file.txt'
# path\to\file.txt -- Windows
'/'.join(('path', 'to', 'file.txt'))
# path/to/file.txt -- Posix
Довольно часто я получаю path/to
из текущего рабочего каталогаpysftp
, так что вместо того, чтобы вручную строить всю строку пути, метод '/'.join()
все еще единственный, который работает.
os.path.join('path/to', 'file.txt')
# path/to\file.txt -- Mixed
Path('path/to') / 'file.txt'
# path\to\file.txt -- Windows
'/'.join(('path/to', 'file.txt'))
# path/to/file.txt -- Posix
Есть ли способ заставить os.path.join()
или pathlib.Path
использовать разделитель Posix при работе в Windows?Я попытался установить атрибут sep
для Path
, но кажется, что это должно быть сделано для каждого Пути в отдельности, даже если он не поднял AttributeError
и, похоже, не хочет, чтобы я создавал экземпляркласс PosixPath
напрямую.
p = Path('path/to')
p.sep = '/'
# AttributeError: 'WindowsPath' object has no attribute 'sep'
PosixPath('path') / 'to' / 'file.txt'
# NotImplementedError: cannot instantiate 'PosixPath' on your system
Попытка «обмануть» модуль os
с помощью os.name = 'posix'
или os.sep = '/'
не работает либо
print(os.name)
# nt
print(os.path.join("path", "to", "file.txt"))
# path\to\file.txt -- Windows as expected
os.sep = '/'
print(os.path.join("path", "to", "file.txt"))
# path\to\file.txt -- Windows as expected
os.name = 'posix'
print(os.name)
# posix
print(os.path.join("path", "to", "file.txt"))
# path\to\file.txt -- still Windows.
os.sep = '/'
print(os.path.join("path", "to", "file.txt"))
# path\to\file.txt -- still Windows.
Если это такнезависимо от того, я использую Python 3.7.0
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32