setup.py

时间:2019-02-11 18:27:59

标签: python package libmagic

我正在写一个依赖于libraryfile-magic,它在大多数平台上都可以正常工作,但是在Alpine Linux中,文件魔术无法正常工作我需要改用python-magic库。

现在,我知道如何编写自己的代码来处理不同的Python库API,但是我不知道如何做,就是编写setup.cfgsetup.py以具有不同的要求基于我们要在其上进行安装的系统。

我认为最好的选择是使用PEP 508规则,但是我无法弄清楚如何说“像Alpine这样的libmagic”或这种语法,更不用说它是否可以在软件包的setup.py。确实,我什至在不安装file-magic并看着它死掉的情况下,甚至不知道如何分辨这些体系结构之间的区别:-(

当然,这种事情一定有最佳实践吗?

更新

经过下面蒂姆(Tim)的更广泛理解,我将这个hack拼凑起来以使其正常工作:

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())

这允许使用setup.cfg的声明性语法,但是如果安装目标是Alpine系统,则可以调整install_requires的值。

1 个答案:

答案 0 :(得分:1)

您可能想使用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软件包的方向。 PyPi上的发行版文档承认需要这种类型的信息,并且在此处找到的示例用法如下:

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