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