I'm trying to use python's bitstring
module in a script and am getting an import error. This error does not happen when running from interactive mode.
Here's the code:
import bitstring
b = bitstring.BitArray(bin='001001111')
When run like this:
python test.py
I get this:
AttributeError: 'module' object has no attribute 'BitArray'
However, when I do this:
$ 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
It works just fine! It's the same interpreter being run by the same user. Any pointers?
I predict you have created a bitstring.py in your current directory.
The problem is caused by a bitstring.py
file in sys.path
of test.py
, but not in that of the interactive python shell. Most likely, there's a bitstring.py
file in the directory test.py
is in, and you started your shell from another working directory.
Since python traverses sys.path
from front to end, modules in the current directory - even if accidentally created - overshadow those in system library directories.
Google App Engine actually had a similar issue at one point. The easiest solution there was simply comment the offending line or use try...except. Obviously that won't work here.
In that case, the problem was initialization order. A half second later a similar line of code was called again with success. Their solution? refactor. :-(
The best I've seen is a dynamic lookup of the class: bitstring.__dict__.get("BitArray")
or getattr(bitstring, "BitArray");
. It isn't ideal (and I believe I've even seen those return null), but hopefully it can get you somewhere.