проблемы с импортом модуля python

#python #module #import

#python #модуль #импорт

Вопрос:

Я пытаюсь использовать bitstring модуль python в скрипте и получаю сообщение об ошибке импорта. Эта ошибка не возникает при запуске из интерактивного режима.

Вот код:

 import bitstring
b = bitstring.BitArray(bin='001001111')
  

При запуске подобным образом:

 python test.py
  

Я получаю это:

 AttributeError: 'module' object has no attribute 'BitArray'
  

Однако, когда я делаю это:

 $ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import bitstring
>>> b = bitstring.BitArray(bin='001001111')
>>> print b
0b001001111
  

Это работает просто отлично! Это тот же интерпретатор, который запускается тем же пользователем. Есть какие-нибудь указания?

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

1. Распечатайте bitsrting.__file__ из скрипта в неинтерактивном режиме и убедитесь, что он указывает на правильный файл

2. Это происходит в том же каталоге?

3. Я предполагаю, что вы создали bitstring.py в вашем текущем каталоге.

4. Я pip отредактировал bitstring , запустил ваш код, и у меня нет проблем. Я использовал cpython 2.7 в WinXP. Вы пробовали запускать его или устанавливали bitstring правильно?

5. Майкл, ты прав! lol Спасибо за совет.

Ответ №1:

Я предполагаю, что вы создали bitstring.py в вашем текущем каталоге.

Ответ №2:

Проблема вызвана bitstring.py файлом в sys.path из test.py , но не в файле интерактивной оболочки Python. Скорее всего, в каталоге, в котором bitstring.py находится, есть test.py файл, и вы запустили свою оболочку из другого рабочего каталога.

Поскольку python проходит sys.path от интерфейса до конца, модули в текущем каталоге — даже если они созданы случайно — затмевают модули в каталогах системной библиотеки.

Ответ №3:

У Google App Engine действительно была похожая проблема в какой-то момент. Самым простым решением было просто прокомментировать оскорбительную строку или использовать try … except. Очевидно, что здесь это не сработает.

В этом случае проблема заключалась в порядке инициализации. Полсекунды спустя аналогичная строка кода была вызвана снова с успехом. Их решение? рефакторинг. 🙁

Лучшее, что я видел, — это динамический поиск класса: bitstring.__dict__.get("BitArray") or getattr(bitstring, "BitArray"); . Это не идеально (и, по-моему, я даже видел, как они возвращают null), но, надеюсь, это может вас куда-нибудь привести.