强制 `setup.py` 使用 setuptools

0 投票
1 回答
1602 浏览
提问于 2025-04-16 18:08

我正在使用这段代码:

code = 'import setuptools;__file__={0!r};execfile(__file__)'.format(os.path.join(path, 'setup.py'))
args = ['install', '--single-version-externally-managed']
subprocess.check_call([sys.executable, '-c', code, args])

来执行一个 setup.py 文件并安装一个软件包。问题出现在 setup.py 使用了 distutils 而不是 setuptools:--single-version-externally-managed 这个选项在 distutils 中是无法识别的。

我该如何强制 setup.py 使用 setuptools 呢?

1 个回答

2

你写的内容基本上就是pip在做的事情。根据你写的代码,你会使用setuptools的setup函数,因为你是从setuptools导入的。setuptools覆盖了Distutils的setup函数,在它的__init__.py文件里。所以,不管setup.py脚本是否导入了distutils,这都没关系。setuptools总是会优先使用...

如果你在运行命令时遇到问题,可以尝试在执行之前先编译文件。用exec(compile(...))而不是execfile(...)

针对@jknair的回答... 我也不建议使用ez_setup.py,因为这会导致代码重复,可能会出现意想不到的行为,而且在打包分发时通常会被排除(这会让像pip这样的工具在运行setup.py时遇到ImportError,变得很麻烦)。

撰写回答