【问题标题】:How do I convert an absolute Posix path to a Windows path in Python's pathlib如何在 Python 的路径库中将绝对 Posix 路径转换为 ​​Windows 路径
【发布时间】:2022-11-16 23:43:21
【问题描述】:

我在 Windows 上运行 Python 3.9。我有一个绝对的 Posix 路径,例如: '/c/Program Files/clang-format' 我碰巧通过运行 os.system('which clang-format') 获得了这个,但没关系。

我想将其转换为 Windows 路径,以便我可以调用 os.system(path_to_exe)。我不知道它为什么给我 Posix 路径,但它不能使用 Posix 路径。但是无所谓。

我找不到任何与 .as_posix() 函数等效的函数,用于将路径从 Posix 转换为 Windows。我应该怎么办?请注意,它不像用反斜杠替换正斜杠那么简单(这在现代 Windows 中是不必要的)因为这些是绝对路径,所以需要在其中添加 C:。

【问题讨论】:

  • /c/ 替换为C:/ 怎么样?
  • Windows 中默认不存在“which”命令。你在使用 MinGW 吗?在 MinGW 中,路径是这样表示的(例如 /c/ 文件夹而不是 C:/ 驱动器)
  • os.system('/c/Program Files/clang-format --version') 会引发错误吗?
  • 是的,该命令会引发错误:“系统找不到指定的路径。”如果我将它更改为 'C:/Pro...' 那么错误是“'C:/Program' 未被识别为内部或外部命令,...”因此将 '/c' 更改为 'C:/ ' 由于空格而不足。为什么 pathlib 中没有 as_windows() 函数?似乎是明显而明显的不对称。
  • 我正在使用 git bash,我认为它可能基于 MinGW。当然,这就是为什么它在“which”命令中为我提供了一个 Posix 路径。但它不会在 clang-format 命令中接受 Posix 路径。这真是太蹩脚了!

标签: python pathlib


【解决方案1】:

可以使用os.path模块获取Windows NT格式路径,使用os.path.splitdrive函数可以隔离驱动器。这只会让你走到一半;你仍然需要去掉 posix base /c/ 并重建路径。

我用posixpath来处理mingw返回的posix结构。

所以像:

import os
import posixpath

path_to_exe = str(os.system('which clang-format'))
# > '/c/Program Files/clang-format'

drive = os.path.splitdrive(os.path.abspath('.'))[0]
# > 'C:'

# break down the posix path storing it in reverse order
root, ext = posixpath.split(path_to_exe)

rev_path = []
rev_path.append(ext)

while (root != '/c'):
    root, ext = posixpath.split(root)
    rev_path.append(ext)
    
# construct the forward path
path = os.path.join(drive, os.sep)
rev_path.reverse()

for p in rev_path:
    path = os.path.join(path, p)

# path = "C:\Program Files\clang-format"

这很恶心,但应该能让你到达那里。

请注意,这假设您在与 clang-format 可执行文件相同的驱动器上运行 Python 代码。

【讨论】:

    猜你喜欢
    • 2019-11-14
    • 2014-01-28
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2017-08-01
    • 2011-11-07
    • 2011-05-02
    相关资源
    最近更新 更多