On Wed, Nov 11, 2009 at 7:48 PM, Dave Angel <da...@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 -- http://mail.python.org/mailman/listinfo/python-list