NameError: ім'я 'reload' не визначено


81

Я використовую python 3.2.2. Коли я пишу просту програму, я стикаюся з проблемою.

>>> reload(recommendations)
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    reload(recommendations)
NameError: name 'reload' is not defined

Як мені це зробити?


9
"Проста програма", мабуть, не потрібна reload.
Вубл

Я хочу використовувати "reload (рекомендації)", "рекомендації.abc ()". Але він не може знайти рекомендацій
MindHacks

1
@MindHacks Якщо ви не імпортували рекомендації, ви не перезавантажуєте їх, а імпортуєте. import recommendations. Чому ви думали, що вам потрібно використовувати reload()?
Gareth Latty

@geoffspear Більшість "простих програм" для читання файлів з нелатинськими символами reload, на жаль, потрібні .
створений

@GennaroTedesco: якщо ти думаєш про якусь жахливу річ, яку ти читаєш, що передбачає перезавантаження (sys), ніколи цього не роби. Просто зробіть with open('file', 'r', encoding='utf-8') as f: do_whatever. Абсолютно немає необхідності перезавантажувати () модулі в простих програмах або насправді в будь-яких програмах python.
Вубл

Відповіді:


158

Ви, мабуть, хотіли importlib.reload().

from importlib import reload

У Python 2.x це було вбудовано , але в 3.x це в importlibмодулі.

Зверніть увагу, що використання reload()зовнішніх інтерпретаторів, як правило, непотрібне, що ви тут намагалися зробити?


Дякую, це працює. Але якщо я хочу використовувати перезавантаження, я повинен імпортувати файл щоразу?
MindHacks

@MindHacks: Про який "файл" ви говорите?
Sven Marnach

@MindHacks: impце модуль, а не файл. (Він вбудований в ядро ​​інтерпретатора і не відповідає жодному файлу.) І так, для використання imp.reloadвам потрібно імпортувати imp, але це не є великою проблемою.
Свен Манах

@MindHacks Вам потрібно імпортувати impде ви використовуєте reload(), так. Ось як працює простір імен. Чому ви хочете перезавантажити модуль поза інтерактивним запитом?
Gareth Latty,

3
Спасибі, але зітхні. Чому вони не намагаються зробити оболонку кориснішою?
Thomas Ahle

12

Оновлення відповіді @Gareth Latty. impбуло амортизовано в Python 3.4. Тепер ти хочеш importlib.reload().

from importlib import reload

11

Спробуйте importlib.reload.

Перезавантажте раніше імпортований модуль. Аргумент повинен бути об'єктом модуля, тому він повинен бути успішно імпортований раніше. Це корисно, якщо ви редагували вихідний файл модуля за допомогою зовнішнього редактора і хочете спробувати нову версію, не виходячи з інтерпретатора Python.

from importlib import reload

reload(module_name)

0

Як казали інші, вам потрібно importlib.reload(module)або колись, або колись раніше from importlib import reload. Але ви можете приховати from importlib import reloadфайл у файлі ініціалізації. Переконайтеся, що PYTHONSTARTUPце визначено у вашій оболонці. Наприклад,

export PYTHONSTARTUP=$HOME/python/startup.py

може бути розумним рядком для додавання до вашого ~/.bash_profile, якщо ваша оболонка bash, і залежно від того, де ви зберігаєте свої файли python. (Якщо ви дотримуєтесь цих інструкцій, запустіть нове вікно терміналу в цей момент, щоб рядок був виконаний.) Тоді ви можете поставити рядок

from importlib import reload

, ~/python/startup.pyі це відбудеться автоматично. (Знову ж таки, якщо ви продовжуєте, запустіть новий сеанс python на цьому етапі.) Це може виглядати дещо складно лише для вирішення цієї однієї проблеми, але це те, що вам потрібно зробити лише один раз, а потім для кожної подібної проблеми на кшталт "Я б хотів, щоб python завжди це робив", як тільки ви знайдете рішення, ви зможете його помістити ~/python/startup.pyі забути про нього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.