当前位置: 首页 > 面试题库 >

覆盖cmdclass时将忽略python setuptools install_requires

高嘉熙
2023-03-14
问题内容

我有一个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_linksoption,因为不鼓励使用它(例如here),所以我可以使用requirements.txt做到这一点。

当我使用来安装此软件包时pip,一切都工作正常,但是由于某些原因,我必须以与pure一起使用的方式来解决此问题python setup.py install。事实并非如此。

当用我自己的类重写cmdclasssetup()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()

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



 类似资料:
  • 我已经编写了许多通过RESTAPI调用进行通信的服务。这些服务可以配置为使用HTTP或HTTPS。任何给定的客户端都具有定义到服务器的连接的安全配置。“默认”配置属性由应用程序中的值设置。yml在这一点上效果很好。 然而,我逐渐意识到,这在更现实的情况下并不适用。问题是,我试图设置特定的参数,例如启动客户端时的服务器主机/端口,而我设置的值被忽略。 例如: 服务A(客户端)将出于某种目的与服务B(

  • 我试图将某些方法排除在单元测试覆盖范围之外。我之所以使用Cobertura,是因为我发现从2.0版开始,他们引入了一个用于排除方法和类的覆盖忽略注释:https://github.com/Cobertura/Cobertura/wiki/covered-annotations

  • 问题内容: 试图使用Jacoco在Android的Robolectric测试中获得代码覆盖率,但在创建报告时,它只是拒绝承认我的Robolectric测试。 我的jacoco.gradle文件如下: 通过此设置,我可以获得“覆盖率”报告,但是尽管在“ src / test / java”中进行了Robolectric测试,但覆盖率为0%。 如果我在该文件中添加以下代码: 当Gradle尝试同步时,

  • 问题内容: 我已经配置了EclEmma,使其无法正常运行我的单元测试。但是,编辑器仍会突出显示未涵盖的测试代码。我不希望单元测试中突出显示,因为它们没有检测到覆盖率。我怎样才能做到这一点? 问题答案: 我做了以下步骤: 转到 “首选项”- >“ Java”->“代码覆盖率”,然后 将 “仅路径条目匹配” 选项设置为 看来效果很好。

  • 我有一个游戏角色,它位于一个棱柱形关节的中心,只能垂直移动(跳跃)。在初始化时,我在屏幕上加载各种游戏障碍,当“产生”时,这些障碍会从屏幕外向角色移动。最好我想用cocos2d位置更新来控制游戏障碍运动的重新定位,而不是box 2d速度控制。 基本上,我希望我的游戏角色能对游戏障碍做出反应,但我不希望游戏障碍对游戏角色做出反应,我希望能够在box 2d之外改变游戏障碍的位置。 我试着只更新游戏角色

  • 在我的申请中。属性,我已覆盖可分页参数的名称: 但是当我去Swagger UI检查我的Swagger留档时,没有使用新的name参数: 这是我的职能部门的签名: 如何将新名称绑定到文档?我可以更改默认描述吗? 谢谢你的回答!