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()
似乎创建了一个适用于当前文件系统(PosixPath
或 WindowsPath
)的 class 实例,该实例不可移植。如果我在 Windows 客户端上创建一个 WindowsPath
对象,Linux 将无法反序列化它,因为您甚至无法在 Linux系统.
看起来我可以使用 PureWindowsPath
对象,并将其发送到 Linux,但是如何将 PureWindowsPath
对象(表示相对路径)转换为一个 PosixPath
,或至少一个 PurePosixPath
?
这可能吗?还是我想的全错了?
pathlib
是面向对象库,不是通信协议。 只发送字符串.
Windows 可以很好地处理带有正斜杠的路径,pathlib
和 os.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)
强制解决问题。
我正在 Python3 中编写一些软件,旨在备份 Windows 客户端上的目录结构,并将其发送到 Linux 服务器。
我遇到的问题是如何处理 Windows 和 Linux 文件路径。我需要 Windows 客户端创建一个表示源文件相对路径的对象,将该相对路径发送到服务器,以便服务器知道将文件写入目标文件夹中的哪个子目录,然后发送实际数据。
发送实际数据不是问题,但是如何发送 Windows 相对路径到 Linux 系统?我尝试使用 os.path
将其作为字符串进行处理,但很快就变得一团糟。我正在考虑使用 pathlib
.
如果我可以创建某种路径对象,我可以使用 pickle 对其进行序列化,并将其发送到服务器。我会使用 pathlib 中的什么对象来表示路径?
Path()
似乎创建了一个适用于当前文件系统(PosixPath
或 WindowsPath
)的 class 实例,该实例不可移植。如果我在 Windows 客户端上创建一个 WindowsPath
对象,Linux 将无法反序列化它,因为您甚至无法在 Linux系统.
看起来我可以使用 PureWindowsPath
对象,并将其发送到 Linux,但是如何将 PureWindowsPath
对象(表示相对路径)转换为一个 PosixPath
,或至少一个 PurePosixPath
?
这可能吗?还是我想的全错了?
pathlib
是面向对象库,不是通信协议。 只发送字符串.
Windows 可以很好地处理带有正斜杠的路径,pathlib
和 os.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)
强制解决问题。