如何在Cygwin中使用Python有效地将POSIX路径转换为Windows路径? 问题

如何在Cygwin中使用Python有效地将POSIX路径转换为Windows路径? 问题,windows,python-2.7,path,cygwin,Windows,Python 2.7,Path,Cygwin,假设您正在编写一个在cygwin上运行的Python脚本,并调用一个需要输入路径的外部C#可执行文件。 假设您无法以任何方式更改C#可执行文件。 当您将想要的路径发送到可执行文件时,它会拒绝所有cygwin路径 因此,如果将路径/cygdrive/c/location/of/file.html作为POSIX路径传递,它将失败,因为可执行文件需要一个Windows路径,如c:\location\of\file.html 例如: messagelocation=os.path.dirname(os.

假设您正在编写一个在cygwin上运行的Python脚本,并调用一个需要输入路径的外部C#可执行文件。 假设您无法以任何方式更改C#可执行文件。 当您将想要的路径发送到可执行文件时,它会拒绝所有cygwin路径

因此,如果将路径
/cygdrive/c/location/of/file.html
作为POSIX路径传递,它将失败,因为可执行文件需要一个Windows路径,如
c:\location\of\file.html

例如:

messagelocation=os.path.dirname(os.path.realpath(_文件__))
os.system('./cSharpScript.exe'+消息位置)

将导致:

未找到内容的文件(/cygdrive/c/location/of/File.html)。

到目前为止我已经尝试过的事情: PATH=/cygdrive/c/location/of/file.html

1)
path=path.replace('/','\\')

结果:
未找到内容的文件(cygdrivelocationoffice.html)。

2)
path=os.path.abspath(path)

结果:
找不到内容的文件(/cygdrive/c/location/of/File.html)。

  • os.path.realpath
    具有相同的结果
到目前为止,我的解决方案可能完全走错了方向。。。您将如何处理它?

根据:

cygpath-转换Unix和Windows格式的路径,或输出系统路径信息

-w, --windows         print Windows form of NAMEs (C:\WINNT)
例如:

翻译成Python(这是一个粗略的版本,仅用于演示目的):


Windows路径是
r'C:\location\of\file.html'
,其中
“/cygdrive/C”
->
“C:”
,斜杠转换为反斜杠。是的,但我不喜欢手动操作。。。python是否有处理它的方法?不在标准库中;也许PyPI上有一个软件包。或者Cygwin有一个系统函数或命令行实用程序来转换路径。有趣的事实:Windows本身必须将“C:”转换为调用方本地设备目录中的名称。这被引用为魔法前缀“\??\”,例如“\??\C:\location\of\file.html”。它解析为调用方的登录会话装入点目录“\Sessions\0\DosDevices\”,该目录将全局装入目录“\global???”隐藏(在联合中)。这些包含以通常位于“\Device”中的设备为目标的具有众所周知名称的符号链接(也称为连接)。因此,真正的NT路径类似于“\Device\HarddiskVolume2\location\of\file.html”。但也许这也是一个谎言……也许这篇文章会有所帮助@埃尔克森:谢谢你的小费。越短越好!更新了答案。工作起来很有魅力(当然是subprocess.call)。谢谢@CristiFati!
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054237800]> cygpath.exe -w /cygdrive/c/location/of/file.html
C:\location\of\file.html
>>> import subprocess
>>>
>>>
>>> def get_win_path(cyg_path):
...     return subprocess.check_output(["cygpath", "-w", cyg_path]).strip(b"\n").decode()
...
>>>
>>> print(get_win_path("/cygdrive/c/location/of/file.html"))
C:\location\of\file.html