python parser overridden by pymol

Jeremiah H. Savage jeremiahsavage at gmail.com
Thu Nov 12 20:38:00 EST 2009


On Wed, Nov 11, 2009 at 7:48 PM, Dave Angel <davea at ieee.org> wrote:
>
>
> 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)Thank you. That really helped.

To use pymol and numpy to
>>     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
>
>

Thank you. Your second suggestion really helped.

To use pymol and numpy together, I now do the following:

To ~/.bashrc add:
        PYMOL_PATH=/usr/lib/pymodules/python2.5/pymol
        export PYMOL_PATH

Then I can do the following in python:

     import numpy
     numpy.save('123',numpy.array([1,2,3]))
     numpy.load('123.npy')
           array([1, 2, 3])
     import sys
     sys.path.append( "/usr/lib/pymodules/python2.5/pymol")
     import pymol
     pymol.finish_launching()
     pymol.importing.load("/path/to/file.pdb")

Thanks,
Jeremiah



More information about the Python-list mailing list