【问题标题】:Enumerate current running platform information in Python?在 Python 中枚举当前正在运行的平台信息?
【发布时间】:2022-01-22 08:47:29
【问题描述】:

我需要使用 Python 在不同平台上从 GitHub 下载 Go 程序的二进制文件

为了下载与当前平台匹配的二进制文件,我需要将当前平台信息翻译成与GOARCH and GOOS environment variables匹配的格式

在 NodeJS 中,我可以很简单地做到这一点:

function getArch() {
  switch (process.arch) {
    case 'x32': return '386'
    case 'x64': return 'amd64'
    case 'arm64': return 'arm64'
    case 'arm': return 'armv7'
  }

  throw new Error(`architecture "${process.arch}" is not supported`)
}

function getPlatform() {
  switch (process.platform) {
    case 'darwin': return 'darwin'
    case 'linux': return 'linux'
    case 'win32': return 'windows'
  }

  throw new Error(`platform "${process.platform}" is not supported`)
}

但是对于 Python 来说,这似乎很难做到,因为标准库 platform 没有很好的规范,并且没有列出不同平台和架构的所有可能返回值

例如,platform.architecture() 将返回AMD64 用于具有amd64 CPU 的Windows 系统,但x86_64 用于具有相同CPU 的Linux 系统,这使得很难有一种优雅的方式来匹配每个我需要的平台

【问题讨论】:

    标签: python python-3.x cross-platform


    【解决方案1】:

    查阅了platform的源码,写了如下代码,解决了我的情况

    import platform
    
    _ARCHITECTURE_DICT = {
        # For Windows, it uses PROCESSOR_ARCHITECTURE environment variable. Reference:
        # https://docs.microsoft.com/en-us/windows/win32/winprog64/wow64-implementation-details#environment-variables
        # https://github.com/python/cpython/blob/main/Lib/platform.py#L717-L727
        "Windows": {
            "AMD64": "amd64",
            "X86": "386",
            "ARM64": "arm64",
        },
        # For Unix-like system, it follows os.uname result. Reference:
        # https://en.wikipedia.org/wiki/Uname
        "Linux": {
            "x86_64": "amd64",
            "i686": "386",
            "i386": "386",
            "aarch64": "arm64",
            "armv7l": "armv7",
        },
        "Darwin": {
            "x86_64": "amd64",
            "arm64": "arm64",
        },
    }
    
    _SYSTEM_DICT = {
        "Windows": "windows",
        "Linux": "linux",
        "Darwin": "darwin",
    }
    
    
    def _get_platform():
        uname = platform.uname()
        try:
            system = _SYSTEM_DICT[uname.system]
            architecture = _ARCHITECTURE_DICT[uname.system][uname.machine]
        except KeyError:
            raise RuntimeError(
                f"Unsupported platform: {uname.system} {uname.machine}"
            ) from None
        return system, architecture
    
    
    GOOS, GOARCH = _get_platform()
    

    更新:我发现一个第三方库py-cpuinfo可以优雅地获取CPU架构信息,这里是一个例子:

    import platform
    
    from cpuinfo import get_cpu_info
    
    _SYSTEM_MAP = {
        "Windows": "windows",
        "Linux": "linux",
        "Darwin": "darwin",
    }
    
    _ARCHITECTURE_MAP = {
        "X86_32": "386",
        "X86_64": "amd64",
        "ARM_7": "armv7",
        "ARM_8": "arm64",
    }
    
    
    def _get_platform():
        try:
            system = _SYSTEM_MAP[platform.system()]
            architecture = _ARCHITECTURE_MAP[get_cpu_info()["arch"]]
        except KeyError:
            raise RuntimeError(f"Unsupported platform: {platform.uname()!r}") from None
        return system, architecture
    
    
    GOOS, GOARCH = _get_platform()
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多