9

Windows クライアントのディレクトリ構造のバックアップを取り、それを Linux サーバーに送信することを目的として、Python3 でいくつかのソフトウェアを作成しています。

私が抱えている問題は、Windows と Linux のファイル パスを処理する方法です。ソース ファイルへの相対パスを表すオブジェクトを作成し、その相対パスをサーバーに送信する Windows クライアントが必要です。これにより、サーバーはファイルを宛先フォルダー内のどのサブディレクトリに書き込むかを認識し、実際のデータを送信します。

実際のデータを送信することは問題ではありませんが、Windows の相対パスを Linux システムに送信するにはどうすればよいですか? を使って文字列としてやってみましos.pathたが、すぐにめちゃくちゃになりました。の使用を検討していpathlibます。

ある種のパス オブジェクトを作成できれば、pickle を使用してシリアル化し、サーバーに送信できます。ただし、パスを表すために pathlib からどのオブジェクトを使用しますか?

Path()PosixPath現在のファイルシステム (または)で動作するクラスのインスタンスを作成しているようですがWindowsPath、これらは移植可能ではありません。Windows クライアントでオブジェクトを作成すると、Linux システムではオブジェクトをWindowsPathインスタンス化することさえできないため、Linux はそれをデシリアライズできませんWindowsPath

オブジェクトを使用してそれを Linux に送信できるように見えますが、オブジェクト (相対パスを表す) を、または少なくともPureWindowsPathに変換するにはどうすればよいですか?PureWindowsPathPosixPathPurePosixPath

それは可能ですか?それとも、私はそれについてすべて間違って考えていますか?

4

1 に答える 1

12

pathlib通信プロトコルではなく、オブジェクト指向ライブラリです。文字列を送信するだけです。

Windows は、スラッシュを含むパスを問題なく処理でき、両方ともpathlibos.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()convert に渡します。

>>> 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 に答える