ImportError: cannot import name getoutput

ImportError: cannot import name getoutput

我正在使用 future 将代码从 Python 2 移植到 Python 3。

未来化 getoutput 后,导入从

更改

from commands import getoutputfrom subprocess import getoutput

我的代码使用 getoutput 来测试需求文件。

但是,当我运行测试时,出现以下错误:

from subprocess import getoutput
ImportError: cannot import name getoutput

如何避免这种情况?或者是否有任何其他替代方案可用于将 getoutput 从 Python2 未来化为 Python3

您可以使用具有 major 属性的 sys.version_info 对象获取 Python 安装的主要版本。然后,您可以检查此值以查看您是 运行ning on Python 2 还是 Python 3+。

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。 (相当于2.7中的commands.getoutput和3+中的subprocess.getoutput)。

另一种选择是在您的导入周围使用 try-except 块,让它自行解析。

try:
    from subprocess import getoutput
except ImportError:
    from commands import getoutput

我看到我缺少安装别名语句:

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

而且有效。