|
From: Christian B. <chr...@fu...> - 2015-01-30 01:21:08
|
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
|