我正在为需要安装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