簡體   English   中英

如何在沒有系統特定的情況下獲取pathlib的Unix路徑處理功能,例如Path.resolve()將/ tmp更改為/ private / tmp

[英]How to get pathlib’s unix path handling goodies without the system specific ones, eg Path.resolve() changes /tmp to /private/tmp

使用pathlib打了一個有趣的案例,在這里我使用它來表示android設備上的路徑,而不是python正在運行的機器。 仍然有可能利用pathlib的含糖語法和解決unix范圍內的問題的能力,例如相對路徑“ ../../”,而無需解決設備特定的符號鏈接之類的問題,例如“ / tmp / path”->“ / private / TMP /路徑”?

在大多數情況下,pathlib使得處理設備上的路徑非常容易,但是當我想在不使用主機python機器的符號鏈接解析機制的情況下解析設備上的路徑時遇到問題。

我喜歡使用pathlib而不是字符串。 是否可以使用Path對象執行路徑操作和動作,然后將最終文件命令發送到ssh'd進入的設備?

我唯一想解決的問題就是能夠旋轉(Path(“ / tmp / analysis / ptool”)/“ ../../”).resolve照顧..但不要將/ tmp更改為/ private / tmp,這不是我要與此路徑命令一起使用的設備上的符號鏈接。

該示例有些瑣碎的“只用字符串來完成”,但是我要應用此方法的組織和自動化方式明顯更清晰,並且更容易閱讀為Path對象而不是字符串。 如果可能的話,讓它正常工作將是很棒的。

In [1]: import pathlib

In [2]: from pathlib import Path

In [3]: Path('/tmp/hello').resolve()
Out[3]: PosixPath('/private/tmp/hello')

在此處輸入圖片說明

MacOS,Python3.7.3

/private/tmp/tmp內容實際存儲在Mac OS上的位置。 在此平台上, /tmp是符號鏈接。 您可以從操作系統中看到這一點,而無需使用Python:

$ ls -l /tmp
lrwxr-xr-x 1 root wheel 11 Oct 22  2018 /tmp -> private/tmp
$ (cd /tmp && pwd -P)
/private/tmp

pathlib.Path.resolve()將符號鏈接替換為它們指向的絕對路徑,因此它可以完全滿足您的要求。

請參閱為什么/tmp/private/tmp的符號鏈接? 在我們的姊妹網站上問不同

在這種情況下,使用整個Path似乎是錯誤的,因為它公開了stat方法,這些方法將嘗試在本地系統而不是遠程設備上運行。 使用PurePosixPath看起來更好,因為它不會公開太多,並且很容易在派生類中添加resolve方法:

from pathlib import PurePosixPath

class ResolvingPosixPath(PurePosixPath):
    def resolve(self):
        if not self.is_absolute():
            raise ValueError('only able to resolve absolute paths')

        sep = self._flavour.sep
        path = ''

        for name in str(self).split(sep):
            if not name or name == '.':
                # current dir
                continue
            if name == '..':
                # parent dir
                path, _, _ = path.rpartition(sep)
                continue

            path = path + sep + name

        return path or sep

我從pathlib._PosixFlavour.resolve了相關的代碼,如果方便的話,您顯然可以使用較短的類名!

可以根據您的建議使用它:

hello = ResolvingPosixPath('/tmp') / 'hello'
print(hello.resolve())

給我'/tmp/hello'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM