python parser overridden by pymol

Dave Angel davea at ieee.org
Wed Nov 11 22:48:34 EST 2009



Jeremiah wrote:
> Hello,
>
> I'm fairly new to python (version 2.5.4), and am writing a program
> which uses both pymol (version 1.2r1) and numpy (version 1.3.0) from
> debian.
>
> It appears that when I add pymol to $PYTHONPATH, that parser.expr() is
> no longer available, and so I am unable to use numpy.load(). I have
> looked for where parser.expr() is defined in the python system so I
> could place that directory first in $PYTHONPATH, but I have not been
> able to find the file that defines expr().
>
> My reason for using numpy.load() is that I have a numpy array which
> takes an hour to generate. Therefore, I'd like to use numpy.save() so
> I could generate the array one time, and then load it later as needed
> with numpy.load().
>
> I've successfully tested the use of numpy.save() and numpy.load() with
> a small example when the pymol path is not defined in $PYTHONPATH  :
>
>    >>> import numpy
>    >>> numpy.save('123',numpy.array([1,2,3]))
>    >>> numpy.load('123.npy')
>    array([1, 2, 3])
>
>
> However, a problem arises once $PYTHONPATH includes the pymol
> directory. To use the pymol api, I add the following to ~/.bashrc:
>
>    PYMOL_PATH=/usr/lib/pymodules/python2.5/pymol
>    export PYMOL_PATH
>    PYTHONPATH=$PYMOL_PATH
>    export PYTHONPATH
>
> Once this is done, numpy.load() no longer works correctly, as pymol
> contains a file named parser.py ( /usr/lib/pymodules/python2.5/pymol/
> parser.py ), which apparently prevents python from using its native
> parser.
>
>    >>> numpy.load('123.npy')
>    Traceback (most recent call last):
>      File "<stdin>", line 1, in <module>
>      File "/usr/lib/python2.5/site-packages/numpy/lib/io.py", line
> 195, in load
>        return format.read_array(fid)
>      File "/usr/lib/python2.5/site-packages/numpy/lib/format.py",
> line 353, in read_array
>        shape, fortran_order, dtype = read_array_header_1_0(fp)
>      File "/usr/lib/python2.5/site-packages/numpy/lib/format.py",
> line 250, in read_array_header_1_0
>        d = safe_eval(header)
>      File "/usr/lib/python2.5/site-packages/numpy/lib/utils.py", line
> 840, in safe_eval
>        ast = compiler.parse(source, "eval")
>      File "/usr/lib/python2.5/compiler/transformer.py", line 54, in
> parse
>        return Transformer().parseexpr(buf)
>      File "/usr/lib/python2.5/compiler/transformer.py", line 133, in
> parseexpr
>        return self.transform(parser.expr(text))
>    AttributeError: 'module' object has no attribute 'expr'
>
> If I understand the problem correctly, can anyone tell me where
> python.expr() is defined, or suggest a better method to fix this
> problem?
>
> Thanks,
> Jeremiah
>
>   
Generic answers, I have no experience with pymol

If pymol really needs that parser.py, you have a problem, as there can 
only be one module by that name in the application.  But assuming it's 
needed for some obscure feature that you don't need, you could try the 
following sequence.

1) temporarily rename the pymol's  parser.py  file to something else, 
like pymolparser.py, and see what runs.
2) rather than changing the PYTHONPATH, fix  up  sys.path during your 
script initialization.
    In particular, do an    import parser    near the beginning of the 
script.  This gets it loaded, even though you might not need to use it 
from this module.
    After that import, then add the following line (which could be 
generalized later)
    sys.path.append( "/usr/lib/pymodules/python2.5/pymol")


If this works, then you can experiment a bit more, perhaps you don't 
need the extra import parser, just putting the pymol directory at the 
end of the sys.path rather than the beginning may be good enough.

If the parser.py in the pymol is actually needed, you might need to 
rename its internal references to some other name, like pymolparser.

HTH,
DaveA




More information about the Python-list mailing list