[英]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.