9

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

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

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

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

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

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

那可能吗?还是我认为这一切都错了?

4

1 回答 1

12

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

Windows 可以很好地处理带有正斜杠的路径,并且两者pathlib都可os.path以为您规范这些路径。您可能希望规范化协议中的路径以使用 POSIX 路径分隔符(正斜杠)。

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

>>> 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)来强迫这个问题。

于 2019-01-01T18:15:43.777 回答