Importerror: невозможно импортировать вывод имени

Я использую future для переноса кода с Python 2 на Python 3.

После футуризации getoutput импорт изменится с

from commands import getoutput в from subprocess import getoutput

И мой код использует getoutput при тестировании файла требований.

Однако, когда я запускаю тест, я получаю следующую ошибку:

from subprocess import getoutput
ImportError: cannot import name getoutput

Как мне этого избежать? Или есть какая-то другая альтернатива, которая может быть использована для футуризации getoutput с Python2 на Python3

2
0
2 348
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете получить основную версию установки Python, используя объект sys.version_info, который имеет атрибут major. Затем вы можете проверить это значение, чтобы узнать, работаете ли вы на 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. (Это эквивалент commands.getoutput в 2.7 и subprocess.getoutput в 3+).

Другой альтернативой было бы использовать блок try-except вокруг вашего импорта и позволить ему разрешиться самостоятельно.

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

Кодовая база огромна. Поэтому я избегаю использования try except.

Deesha 10.08.2018 17:03

@Deesha без использования зависимости преобразования, вам нужно будет либо if / else, либо try / except. Тем не менее, я посмотрел, и шесть содержит переименование, которое обрабатывает этот случай из коробки. Я обновил свой ответ, и вы, возможно, захотите его использовать, особенно если у вас возникнут другие проблемы с переносом.

Edward Minnix 10.08.2018 17:09

да. Я осмотрелся и обнаружил, что даже future.moves работает. Спасибо .

Deesha 10.08.2018 17:11

Я увидел, что мне не хватает оператора псевдонима установки:

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

И это работает.

Другие вопросы по теме