#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), но, надеюсь, это может вас куда-нибудь привести.