gpt4 book ai didi

覆盖 cmdclass 时忽略 python setuptools install_requires

转载 作者:IT老高 更新时间:2023-10-28 20:47:19 26 4
gpt4 key购买 nike

我有一个如下所示的 setup.py:

from setuptools import setup
from subprocess import call
from setuptools.command.install import install

class MyInstall(install):
def run(self):
call(["pip install -r requirements.txt --no-clean"], shell=True)
install.run(self)

setup(
author='Attila Zseder',
version='0.1',
name='entity_extractor',
packages=['...'],
install_requires=['DAWG', 'mrjob', 'cchardet'],
package_dir={'': 'modules'},
scripts=['...'],
cmdclass={'install': MyInstall},
)

我需要 MyInstall 因为我想从 github 安装一些库并且我不想使用 dependency_links 选项,因为不鼓励使用它(例如 here ) ,所以我可以用 requirements.txt 做到这一点。

当我使用 pip 安装此软件包时,一切正常,但由于某些原因,我必须以一种同样适用于纯 python setup.py install< 的方式解决此问题。但它没有。

当用我自己的类覆盖 setup() 中的 cmdclass 时,install_requires 似乎被忽略了。一旦我注释掉该行,就会安装这些软件包。

我知道例如 distutils 不支持 install_requires(如果我没记错的话),但它在 setuptools 中。然后 cmdclass 不会对 install_requires 产生任何影响。

我用谷歌搜索了这个问题几个小时,在 stackoverflow 上找到了很多相关的答案,但不是针对这个特定问题。

将所有需要的包放到 requirements.txt 中,一切正常,但我想了解为什么会这样。谢谢!

最佳答案

同样的问题也发生在我身上。似乎有些东西触发了 setuptools 使用 distutils 进行“旧式安装”,这确实不支持 install_requires

你在 setuptools/setuptools/command/install.py 的第 51-74 行调用 install.run(self) 调用 run(self)

https://bitbucket.org/pypa/setuptools/src/8e8c50925f18eafb7e66fe020aa91a85b9a4b122/setuptools/command/install.py?at=default

def run(self):
# Explicit request for old-style install? Just do it
if self.old_and_unmanageable or self.single_version_externally_managed:
return _install.run(self)

# Attempt to detect whether we were called from setup() or by another
# command. If we were called by setup(), our caller will be the
# 'run_command' method in 'distutils.dist', and *its* caller will be
# the 'run_commands' method. If we were called any other way, our
# immediate caller *might* be 'run_command', but it won't have been
# called by 'run_commands'. This is slightly kludgy, but seems to
# work.
#
caller = sys._getframe(2)
caller_module = caller.f_globals.get('__name__','')
caller_name = caller.f_code.co_name

if caller_module != 'distutils.dist' or caller_name!='run_commands':
# We weren't called from the command line or setup(), so we
# should run in backward-compatibility mode to support bdist_*
# commands.
_install.run(self)
else:
self.do_egg_install()

我不确定这种行为是否有意,但替换

install.run(self)

install.do_egg_install()

应该可以解决您的问题。至少它对我有用,但我也希望得到更详细的答案。谢谢!

关于覆盖 cmdclass 时忽略 python setuptools install_requires,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21915469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com