2014-12-03 1 views
6

Следующий код:imp.reload - объект NoneType не имеет 'имя' атрибут

def _IMPORT_(path) 
    path = abspath(path) 
    namespace = path[len(getcwd())+1:].replace('/', '_').strip('\\/;,. ') 
    print(path) 
    print(namespace) 
    loader = importlib.machinery.SourceFileLoader(namespace, path+'.py') 
    handle = loader.load_module(namespace) 
    print(handle) 
    importlib.reload(handle) 
    return handle 

производит:

/home/torxed/git/test/unitest/unix 
unitest_unix 
<module 'unitest_unix' from '/home/torxed/git/test/unitest/unix.py'> 

Traceback (most recent call last): 
    File "network.py", line 17, in <module> 
    handle = sock() 
    File "network.py", line 9, in __init__ 
    sock = _IMPORT_('./unix') 
    File "/home/torxed/git/test/unitest/helpers.py", line 13, in _IMPORT_ 
    imp.reload(handle) 
    File "/usr/lib/python3.4/imp.py", line 315, in reload 
    return importlib.reload(module) 
    File "/usr/lib/python3.4/importlib/__init__.py", line 149, in reload 
    methods.exec(module) 
    File "<frozen importlib._bootstrap>", line 1134, in exec 
AttributeError: 'NoneType' object has no attribute 'name' 

Это прекрасно работает в Python 3.3.5, где был введен этот вид операции (перед этим была какая-то аналогичная импортная механика). Однако на Python 3.4.2 Это, по-видимому, не работает.

Что изменилось с 3.3.5? Невозможно найти никаких следов или изменение находится где-то посередине релизов. В прошлом году был зафиксирован патч для этого точного поведения, когда переменные среды не были переданы, но, похоже, здесь работает.

+1

Странно, в моем Python 3.4.2 (Mac OS X) он также не работает, но я получаю: 'Объект 'AttributeError:' module 'не имеет атрибута' machinery''. –

ответ

2

Я получаю ту же ошибку, когда пытаюсь перезагрузить файл после переключения папок.

Например:


Создать простой модуль:

In [10]: %%file temp.py 
    ...: message = "Hello World!" 
    ...: 
Writing temp.py 

Загрузить модуль и распечатать сообщение:

In [14]: import temp 
    ...: print(temp.message) 
Hello World! 

Изменить сообщение:

In [17]: temp.message = 'Hello brave new world!' 
    ...: print(temp.message) 
Hello brave new world! 

Обновить модуль, чтобы вернуть исходное сообщение:

In [18]: import imp 
    ...: imp.reload(temp) 
    ...: print(temp.message) 
Hello World! 

Все хорошо до сих пор ...


Теперь измените пути:

In [20]: cd .. 

Попробуйте обновить модуль :

In [24]: imp.reload(temp) 
Traceback (most recent call last): 

    File "<ipython-input-24-7fa95de0f250>", line 1, in <module> 
imp.reload(temp) 

    File "/home/user/anaconda3/lib/python3.4/imp.py", line 315, in reload 
return importlib.reload(module) 

    File "/home/user/anaconda3/lib/python3.4/importlib/__init__.py", line 149, in reload 
methods.exec(module) 

    File "<frozen importlib._bootstrap>", line 1134, in exec 

AttributeError: 'NoneType' object has no attribute 'name' 

В моем случае решение заключалось в том, чтобы вернуться к пути, в котором импорт был сделан изначально.

+0

Большое вам спасибо! У меня была такая же проблема, и я не мог ее найти. Когда я прочитал ваш ответ, я понял, что мой скрипт выполняет свой импорт с помощью менеджера контекста. Я не знал, что перезагрузка не сохраняет путь импорта! Теперь я должен использовать тот же менеджер контекста, который я использовал для импорта, и все в порядке. Но это действительно раздражает, потому что модуль все еще знает путь ... –

 Смежные вопросы

  • Нет связанных вопросов^_^