代码之家  ›  专栏  ›  技术社区  ›  Deesha

importTerror:无法导入名称getoutput

  •  1
  • Deesha  · 技术社区  · 7 年前

    我在用 future 将代码从Python2移植到Python3。

    关于未来化 getoutput ,导入将从

    from commands import getoutput from subprocess import getoutput

    我的代码使用 获取输出 在测试需求文件时。

    但是,当我运行测试时,会得到以下错误:

    from subprocess import getoutput
    ImportError: cannot import name getoutput
    

    我该如何避免?或者还有其他的方法可以用于未来的处理 获取输出 从蟒蛇2号到蟒蛇3号

    2 回复  |  直到 7 年前
        1
  •  3
  •   Edward Minnix    7 年前

    您可以使用 sys.version_info 对象,它具有 major 属性。然后您可以检查这个值,看看您是在Python2还是Python3+上运行。

    import sys
    
    if sys.version_info.major == 2:
        from commands import getoutput
    else:
        from subprocess import getoutput
    

    如果很少有条件导入和其他简单语句,这将起作用。否则,您可以查看类似于 six ,它用于通过给定特定的层让您在2和3中运行代码。六个包含一个模块 six.moves ,其中包含 six.moves.getoutput ,这将解决 getoutput 是的。(相当于 commands.getoutput 在2.7和 subprocess.getoutput 在3+中。

    另一种方法是在导入周围使用try-except块,并让它自行解决。

    try:
        from subprocess import getoutput
    except ImportError:
        from commands import getoutput
    
        2
  •  1
  •   Deesha    7 年前

    我看到缺少install alias语句:

    from future import standard_library
    standard_library.install_aliases()
    from subprocess import getoutput
    

    然而,这给了 PEP-8 错误: Module level import not at top of file

    所以我用 future.moves 取而代之的是:

    from future.moves.subprocess import getoutput

    而且有效。