如何在 msys python 中获取本机 Windows 路径?

Posted

技术标签:

【中文标题】如何在 msys python 中获取本机 Windows 路径?【英文标题】:How to get native windows path inside msys python? 【发布时间】:2017-05-20 10:29:38 【问题描述】:

在 msys2-Python (3.4.3) 中,我应该如何从 msys-filesystem 获取某些文件的本地 windows 路径?

我想为原生 Windows 应用程序编写一个配置文件,这样就不会考虑 msys 路径重写。

有一个解决方案,但我不喜欢它,因为我必须将未知路径输入到 shell 中:

path = "/home/user/workspace"
output = subprocess.check_output( 'cmd //c echo ' + path, shell = True )

这将返回C:/msys64/home/user/workspace

这个问题实际上并不是Convert POSIX->WIN path, in Cygwin Python, w/o calling cygpath 的重复,因为它是关于msys2

【问题讨论】:

***.com/questions/10884268/… 【参考方案1】:

MSYS2 带有一个名为cygpath 的实用程序,您可以使用它。运行cygpath -w NAMEcygpath/usr/bin 中的一个命令行实用程序,您可以像运行任何其他命令行实用程序一样运行它。输出将是与您传递的 NAME 参数相对应的 Windows 样式路径。

【讨论】:

这对那些安装了 cygwin 的人很有用,但我不相信这个命令对 msys 可用,根据 OP 的问题。 你不需要安装cygwin。 MSYS2 在其 msys2-runtime 包中带有/usr/bin/cygpath.exe。目前尚不完全清楚 OP 是否使用 MSYS2 或其他类似系统,但问题被标记为“msys2”,所以我希望 MSYS2 用户来到这里并发现我的答案很有用。 感谢您的澄清。我还在 MSYS1 页面上找到了这一点:“对于任何不依赖于 msys-1.0.dll 的可执行文件,MSYS 会将用作参数的 POSIX 路径转换为 ​​Win32 路径”。我不确定这是否相关? mingw.org/wiki/Posix_path_conversion【参考方案2】:

基于这个很好的答案https://***.com/a/38471976/5892524 这里是重写的相同代码以在 msys2 中使用。

import ctypes
import sys

xunicode = str if sys.version_info[0] > 2 else eval("unicode")

# If running under Msys2 Python, just use DLL name
# If running under non-Msys2 Windows Python, use full path to msys-2.0.dll
# Note Python and msys-2.0.dll must match bitness (i.e. 32-bit Python must
# use 32-bit msys-2.0.dll, 64-bit Python must use 64-bit msys-2.0.dll.)
msys = ctypes.cdll.LoadLibrary("msys-2.0.dll")
msys_create_path = msys.cygwin_create_path
msys_create_path.restype = ctypes.c_void_p
msys_create_path.argtypes = [ctypes.c_int32, ctypes.c_void_p]

# Initialise the msys DLL. This step should only be done if using
# non-msys Python. If you are using msys Python don't do this because
# it has already been done for you.
if sys.platform != "msys":
    msys_dll_init = msys.msys_dll_init
    msys_dll_init.restype = None
    msys_dll_init.argtypes = []
    msys_dll_init()

free = msys.free
free.restype = None
free.argtypes = [ctypes.c_void_p]

CCP_POSIX_TO_WIN_A = 0
CCP_POSIX_TO_WIN_W = 1
CCP_WIN_A_TO_POSIX = 2
CCP_WIN_W_TO_POSIX = 3

def win2posix(path):
    """Convert a Windows path to a msys path"""
    result = msys_create_path(CCP_WIN_W_TO_POSIX, xunicode(path))
    if result is None:
        raise Exception("msys_create_path failed")
    value = ctypes.cast(result, ctypes.c_char_p).value
    free(result)
    return value

def posix2win(path):
    """Convert a msys path to a Windows path"""
    result = msys_create_path(CCP_POSIX_TO_WIN_W, str(path))
    if result is None:
        raise Exception("msys_create_path failed")
    value = ctypes.cast(result, ctypes.c_wchar_p).value
    free(result)
    return value

【讨论】:

以上是关于如何在 msys python 中获取本机 Windows 路径?的主要内容,如果未能解决你的问题,请参考以下文章

python --获取本机屏幕分辨率

win10环境下MinGW和MSYS的安装与配置

如何在 MSYS2 中使用 Windows Python 安装

win10下使用msys+vs2019编译ffmpeg源码

win10下使用msys+vs2019编译ffmpeg源码

win10下使用msys+vs2019编译ffmpeg源码