Как решить ошибку AttributeError при импорте igraph?

#python #import #packages #igraph

#python #импорт #пакет #igraph

Вопрос:

Когда я импортирую пакет igraph в свой проект, я получаю ошибку AttributeError. Это происходит только в каталоге проекта:

 [12:34][~]$ python2
Python 2.7.1 (r271:86832, Apr 15 2011, 12:09:10) 
[GCC 4.5.2 20110127 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import igraph
>>> 

[12:34][~]$ cd projectdir/
[12:34][projectdir]$ python2
Python 2.7.1 (r271:86832, Apr 15 2011, 12:09:10) 
[GCC 4.5.2 20110127 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import igraph
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/igraph/__init__.py", line 42, in <module>
    import gzip
  File "/usr/lib/python2.7/gzip.py", line 36, in <module>
    class GzipFile(io.BufferedIOBase):
AttributeError: 'module' object has no attribute 'BufferedIOBase'
>>>
  

Нет файла igraph.py в каталоге проекта:

 [12:34][projectdir]$ ls -alR | grep igraph | wc -l
0
  

И нет циклического импорта.

Как я могу устранить эту ошибку?

Ответ №1:

Скорее всего, есть модуль io в ~/projectdir или один из путей, которые настраивает проект. Модуль gzip, импортированный igraph, начинается с

 import io
  

и ожидайте встроенный модуль ввода-вывода, а не модуль вашего проекта. Найдите io каталог, или io.py или io.pyc . Это также может помочь тщательно изучить sys.path любые другие каталоги (возможно, за пределами ~/projectdir ), которые могут содержать модули с именами io .

Комментарии:

1. Спасибо. У меня был пакет io в моем проекте. В следующий раз я знаю, как это решить.

2. Так вот в чем причина… каково разрешение? Кажется, что очевидным решением является переименование io пакета в проекте, но есть ли другое решение, которое не требует переименования пакета ввода-вывода?

3. @mutzmatron Оставление вашего пользовательского io — это путь к неприятностям, поэтому вам действительно следует переименовать его. Хотя вы можете временно вносить изменения sys.path , это невероятно хрупко. В любом случае, вы должны использовать абсолютный импорт, например import myproject.div.io_utils

4. Спасибо за подтверждение, что @phihag — хотя немного раздражает, что инструкции import не соблюдают иерархические пространства имен должным образом — или, я предполагаю, точнее, что когда каталог пакета добавляется в path, это делает любую из его функций или подмодулей импортируемой без указания полного иерархического пространства имен.