包装信息.print_text_info

问题描述

AttributeError: 'str' object has no attribute 'build_system_class'

我在尝试运行此代码时收到此错误。有谁知道出了什么问题?

import spack.cmd.info
import sys

pkg = sys.argv[1]
spack.cmd.info.print_text_info(pkg)

解决方法

根据我从您的问题和文档中看到的,我假设如下:

  1. 您正在尝试使用 Spack API (https://spack.readthedocs.io/en/latest/spack.cmd.html?highlight=print_text_info#spack.cmd.info.print_text_info)
  2. 您正在 spack 包管理器之上构建某种自动化,我怀疑它是一个包。
  3. 您正在使用 Python 的 sys 包 (https://docs.python.org/3/library/sys.html)

您遇到的问题与 Spack 无关,而与 Python 或面向对象编程有关。 您正在获取一个字符串 sys.argv[1],它表示命令行中提供的包名称,并将其提供给方法 print_text_info,该方法需要 PackageBase 类型的对象或其继承,例如 AutotoolsPackage。>

Python 使用字符串调用该方法并调用字符串不存在的 PackageBase 类型的成员,导致上述错误。

如果查看 spack 的 info.py,可以看到它在第一次尝试调用 build_system_class 方法时失败。

def print_text_info(pkg):
    """Print out a plain text description of a package."""

    header = section_title(
        '{0}:   '
    ).format(pkg.build_system_class) + pkg.name
    color.cprint(header)

如果您查看 info() 中的 spack info 方法(实现 spack.cmd.info 命令),您可以看到如何查找名称以获取包实例:

def info(parser,args):
    pkg = spack.repo.get(args.package)
    print_text_info(pkg)

因此,要将 PacakgeBase 实例传递给 print_text_info(),您只需要 import spack.repo 并调用 spack.repo.get(name) 如上所述。