可以在Linux和Windows系统之间移植使用Python3的pathlib吗?

时间:2019-01-01 18:03:43

标签: python python-3.x pathlib

我正在用Python3编写一些旨在备份Windows客户端上的目录结构并将其发送到Linux服务器的软件。

我遇到的问题是如何处理Windows和Linux文件路径。我需要Windows客户端创建一个代表源文件相对路径的对象,将该相对路径发送到服务器,以便服务器知道将文件写入目标文件夹中的哪个子目录,然后发送实际数据。 / p>

发送实际数据不是问题,但是如何将Windows相对路径发送到Linux系统?我尝试使用os.path以字符串的形式进行操作,但是很快就变得一团糟。我正在使用pathlib

如果我可以创建某种路径对象,则可以使用pickle对其进行序列化,然后将其发送到服务器。我将使用pathlib中的哪个对象来表示路径?

Path()似乎创建了一个适用于当前文件系统(PosixPathWindowsPath)的类的实例,它们不能移植。如果我在Windows客户端上创建WindowsPath对象,Linux将无法反序列化它,因为您甚至无法在Linux系统上实例化WindowsPath对象。

看起来我可以使用PureWindowsPath对象,并将其发送到Linux,但是如何将PureWindowsPath对象(代表相对路径)转换为PosixPath ,或至少PurePosixPath

有可能吗?还是我在想这一切错了?

1 个答案:

答案 0 :(得分:3)

pathlib是一个OO库,而不是通信协议。 只需发送字符串

Windows可以很好地处理带有正斜杠的路径,而pathlibos.path都可以为您规范化此类路径。您可能希望规范化协议中的路径以使用POSIX路径分隔符(正斜杠)。

您可以使用pathlib.PurePosixPath()将相对Windows路径转换为POSIX路径,例如:

>>> from pathlib import Path, PurePosixPath
>>> Path('relative\path\on\windows')
WindowsPath('relative\path\on\windows')
>>> PurePosixPath(_)
PurePosixPath('relative/path/on/windows')
>>> str(_)
'relative/path/on/windows'

如果服务器使用Windows约定接收到相对路径,请使用PureWindowsPath()将其转换为pathlib对象,然后将其传递给Path()进行转换:

>>> from pathlib import Path, PureWindowsPath
>>> received = 'relative\path\on\windows'
>>> PureWindowsPath(received)
PureWindowsPath('relative/path/on/windows')
>>> Path(_)
PosixPath('relative/path/on/windows')

如果将路径保留为字符串,则可以使用str.replace(os.altsep, os.sep)在Windows端实现相同的目的,然后再发送:

>>> import os
>>> p = 'relative\path\on\windows'
>>> p.replace(os.altsep, os.sep)
'relative/path/on/windows'

,您随时可以使用relative_path.replace('\\', os.sep)来强制问题。