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

Can Python3's pathlib be used portably between Linux and Windows systems?

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

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

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

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

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

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

这可能吗?还是我想的全错了?

pathlib是面向对象库,不是通信协议。 只发送字符串.

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) 强制解决问题。