Dear pymol experts,

I found some odd behaviour when trying to use pymol.session in my 
script. I'm using open source pymol 1.7.4.0 (built from svn) on linux. 
Here comes a minimal example:

1) Create a directory, containing the following 2 files:

--- script.py ---
from pymol import cmd, session

def print_session_id():
     print id(session)
cmd.extend("print_session_id", print_session_id)

def set_foo(value):
     session.foo = value
cmd.extend("set_foo", set_foo)

def print_foo():
     print session.foo
cmd.extend("print_foo", print_foo)
--- end script.py ---

--- .pymolrc.py ---
import script
--- end .pymolrc.py ---

2) Change to this directory and start pymol.

3) In the pymol CLI, do:

script_set_foo bar
script_print_foo
script_session_id
python
print id(session)
print session.foo
session.foo = "foo"
python end
script_print_foo
save test.pse

This produces the output given below. Note that the id of the session 
object is the same when printed from the script and from within the 
pymol session, and how the script reflects changes made to the 
session.foo variable from the pymol CLI and vice versa.

--- pymol log ---
PyMOL>script_set_foo bar
PyMOL>script_print_foo
bar
PyMOL>script_session_id
139958033268464
PyMOL>python
PyMOL>print id(session)
     1:print id(session)
PyMOL>print session.foo
     2:print session.foo
PyMOL>session.foo = "foo"
     3:session.foo = "foo"
PyMOL>python end
PyMOL>python end
139958033268464
bar
PyMOL>script_print_foo
foo
PyMOL>save test.pse
  Save: Please wait -- writing session file...
  Save: wrote "test.pse".
PyMOL>quit
  PyMOL: normal program termination.
--- end pymol log ---

4) If I now start pymol, load test.pse and run the following commands in 
the pymol CLI:

script_print_foo
script_session_id
script_set_foo bar
python
print id(session)
print session.foo
python end

I get the following results:

--- pymol log ---
  Executive: Loading version 1.740 session...
PyMOL>script_print_foo
Traceback (most recent call last):
   File "/usr/lib64/python2.7/site-packages/pymol/parser.py", line 256, 
in parse
     self.result=apply(layer.kw[0],layer.args,layer.kw_args)
   File "script.py", line 12, in script_print_foo
     print session.foo
AttributeError: Session_Storage instance has no attribute 'foo'
PyMOL>script_session_id
139950852452080
PyMOL>script_set_foo bar
PyMOL>python
PyMOL>print id(session)
     1:print id(session)
PyMOL>print session.foo
     2:print session.foo
PyMOL>python end
PyMOL>python end
139950603504528
foo
PyMOL>script_print_foo
bar
--- end pymol log ---

Note that the ids of the session objects differ when printed from the 
script or from the pymol CLI, and the contents of the variable 
session.foo differs between pymol CLI and script.

If I do not import script.py from .pymolrc.py, everything works as expected.

Apparently, loading of a new session file creates a new instance of the 
pymol.session object. Shouldn't the pymol.session instance be created 
once upon startup, so it can be shared between all scripts? And only 
values assigned to this instance upon loading a session from file?

Is there a way to import scripts from .pymolrc.py, load a session file 
*and* get the correct pymol.session object within the script?
Or is there an alternative way to get custom data saved in session files 
that can be used in scripts?


Best,

Christian

------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
PyMOL-users mailing list (PyMOL-users@lists.sourceforge.net)
Info Page: https://lists.sourceforge.net/lists/listinfo/pymol-users
Archives: http://www.mail-archive.com/pymol-users@lists.sourceforge.net

Reply via email to