如何找出setup.py使用哪个库?

时间:2019-01-17 19:18:40

标签: python setuptools

我正在为需要安装python模块的环境编写安装脚本。不幸的是,带有setuptools的默认setup.py install命令不起作用,因为我不想安装鸡蛋(长话不说)。这意味着我需要提供--single-version-externally-managed,但仅当setup.py使用setuptools时才提供。但是,如果setup.py使用distutils,则无法识别该选项。

是否可以通过编程方式确定任意setup.py是否使用setuptools?

我有一个可以正常工作的黑客。我有一个脚本用作setup.py的包装。该脚本使用importlib.util中的函数(spec_from_file_location,module_from_spec和exec_module)从包装脚本加载并执行setup.py。然后,我检查sys.modules以查看setuptools是否存在。这有点丑陋,但似乎可行。有更好的方法吗?

我的黑客失败的地方是如果setup.py不平凡,它可以决定不导入setuptools,除非__name__ == "__main__"(在我的情况下不是,因为我是从包装器加载它的脚本)。如果我的基本方法合理,是否可以通过一种方法诱使导入的模块认为其名称为__main__?还是我吠错了树?

谢谢!

编辑:这是一个代码示例。

注意:我并不特别在意这个名称,但是我需要给setup.py一个argv,因为setup()函数希望处理它。我只想给setup()一个argv,它不会做任何事情。除非setup.py足够聪明,除非__name__ == "__main__"才能导入setuptools或调用setup,否则它将起作用。


    # In case setup.py imports local files
    sys.path.append('.')

    spec = importlib.util.spec_from_file_location("setupmod", "setup.py")
    module = importlib.util.module_from_spec(spec)

    old_argv = sys.argv
    sys.argv = ["setup.py", "--name"]

    try:
        spec.loader.exec_module(module)

    finally:
        sys.argv = old_argv

    uses_setuptools = False
    uses_distutils = False

    for m in sys.modules:
        if m == "setuptools":
            uses_setuptools = True
        elif m == "distutils.core":
            uses_distutils = True

0 个答案:

没有答案