代码之家  ›  专栏  ›  技术社区  ›  Daniel Quinn

setup.py中的条件要求

  •  0
  • Daniel Quinn  · 技术社区  · 6 年前

    我在写一篇文章 library 这取决于 file-magic 这对 平台,但是在AlpineLinux中,文件魔法不起作用,所以我需要使用 python-magic 图书馆。

    现在我知道如何编写自己的代码来处理不同的Python库API,但我不知道如何编写 setup.cfg setup.py 根据我们安装的系统有不同的要求。

    我想最好的选择是使用 PEP 508 规则,但我不知道如何用这种语法说“libmagic like alpine”,更不用说在包的setup.py中是否有效了。实际上,我甚至无法在不安装的情况下分辨体系结构之间的区别。 file-magic 看着它死去:-(

    当然,这类事情必须有最佳实践?

    更新

    在从下面的Tim那里获得了更广泛的理解之后,我拼凑出了这个黑客程序来让它工作:

    def get_requirements():
        """
        Alpine is problematic in how it doesn't play nice with file-magic -- a
        module that appears to be the standard for most other Linux distros.  As a
        work-around for this, we swap out file-magic for python-magic in the Alpine
        case.
        """
    
        config = configparser.ConfigParser()
        config.read("setup.cfg")
        requirements = config["options"]["install_requires"].split()
    
        os_id = None
        try:
            with open("/etc/os-release") as f:
                os_id = [_ for _ in f.readlines() if _.startswith("ID=")][0] \
                    .strip() \
                    .replace("ID=", "")
        except (FileNotFoundError, OSError, IndexError):
            pass
    
        if os_id == "alpine":
            requirements[1] = "python-magic>=0.4.15"
    
        return requirements
    
    
    setuptools.setup(install_requires=get_requirements())
    

    这允许 安装程序 但是调整了 install_requires 如果安装目标是高山系统,则为值。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Tim Klein    6 年前

    你可能想用 platform module 尝试识别系统详细信息。

    最好的办法是尝试使用 platform.architecture() , platform.platform() platform.system() 正确处理错误并考虑所有可能的返回信息。

    例子:

    我在Win10上运行,下面是这些函数的输出(还有一个):

    >>> import platform
    >>> print(platform.architecture())
    ('32bit', 'WindowsPE')
    >>> print(platform.platform())
    Windows-10-10.0.17134-SP0
    >>> print(platform.processor())
    Intel64 Family 6 Model 142 Stepping 10, GenuineIntel
    >>> print(platform.system())
    Windows
    

    编辑

    上面的答案不一定返回您想要的信息(我没有提到平台模块中任何不推荐使用的函数)。

    挖得深一点,产量 this SO result 这说明用于收集发行版名称的内置平台函数已被弃用。

    官方文件指向一个名为 distro . pypi上的distro docs确认需要这种类型的信息,并且在这里找到了一个示例用法,如下所示:

    >>> import distro
    >>> distro.linux_distribution(full_distribution_name=False)
    ('centos', '7.1.1503', 'Core')