syncmol.py (pymol-v1.8.6.0.tar.bz2) | : | syncmol.py (pymol-v2.1.0.tar.bz2) | ||
---|---|---|---|---|
skipping to change at line 24 | skipping to change at line 24 | |||
# pymol syncmol.py -- recv 8001 send 8002 | # pymol syncmol.py -- recv 8001 send 8002 | |||
# pymol syncmol.py -- send 8001 recv 8002 | # pymol syncmol.py -- send 8001 recv 8002 | |||
# MUTUAL SYNCHRONIZATION (over a lan): | # MUTUAL SYNCHRONIZATION (over a lan): | |||
# on host1: pymol syncmol.py -- recv 8000 send host2:8000 | # on host1: pymol syncmol.py -- recv 8000 send host2:8000 | |||
# on host2: pymol syncmol.py -- recv 8000 send host1:8000 | # on host2: pymol syncmol.py -- recv 8000 send host1:8000 | |||
import threading | import threading | |||
import socket | import socket | |||
import cPickle | ||||
import socket # For gethostbyaddr() | import socket # For gethostbyaddr() | |||
import SocketServer | ||||
import sys | import sys | |||
import traceback | import traceback | |||
import copy | import copy | |||
import os | import os | |||
import time | import time | |||
import Queue | ||||
try: | ||||
import cPickle | ||||
import SocketServer | ||||
import Queue | ||||
except ImportError: | ||||
import pickle as cPickle | ||||
import socketserver as SocketServer | ||||
import queue as Queue | ||||
class PyMOLWriter: # this class transmits | class PyMOLWriter: # this class transmits | |||
def __init__(self, pymol, host='localhost', port=8000): | def __init__(self, pymol, host='localhost', port=8000): | |||
host = str(host) | host = str(host) | |||
port = int(port) | port = int(port) | |||
self.host = host | self.host = host | |||
self.port = port | self.port = port | |||
self.sock = None | self.sock = None | |||
self.cmd = pymol.cmd | self.cmd = pymol.cmd | |||
self.fifo = Queue.Queue(0) | self.fifo = Queue.Queue(0) | |||
cmd = self.cmd | cmd = self.cmd | |||
print " syncmol: writing to %s:%d"%(host,port) | print(" syncmol: writing to %s:%d"%(host,port)) | |||
pymol.cmd.log_open(self.fifo) | pymol.cmd.log_open(self.fifo) | |||
last_view = None | last_view = None | |||
last_frame = 0 | last_frame = 0 | |||
while 1: | while 1: | |||
time.sleep(0.1) # update 10x a second | time.sleep(0.1) # update 10x a second | |||
view = cmd.get_view(output=4) | view = cmd.get_view(output=4) | |||
try: | try: | |||
cmd.lock() | cmd.lock() | |||
if hasattr(cmd,"_last_view"): | if hasattr(cmd,"_last_view"): | |||
skipping to change at line 93 | skipping to change at line 99 | |||
def _remote_call(self,meth,args=(),kwds={}): | def _remote_call(self,meth,args=(),kwds={}): | |||
result = None | result = None | |||
while self.sock == None: | while self.sock == None: | |||
try: | try: | |||
self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) | self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) | |||
self.sock.connect((self.host,self.port)) | self.sock.connect((self.host,self.port)) | |||
self.send = self.sock.makefile('w') | self.send = self.sock.makefile('w') | |||
self.recv = self.sock.makefile('r') | self.recv = self.sock.makefile('r') | |||
except: | except: | |||
self.sock=None | self.sock=None | |||
print "retrying..." | print("retrying...") | |||
time.sleep(1) | time.sleep(1) | |||
cPickle.dump(meth,self.send,1) # binary by default | cPickle.dump(meth,self.send,1) # binary by default | |||
cPickle.dump(args,self.send,1) | cPickle.dump(args,self.send,1) | |||
cPickle.dump(kwds,self.send,1) | cPickle.dump(kwds,self.send,1) | |||
self.send.flush() | self.send.flush() | |||
result = cPickle.load(self.recv) | result = cPickle.load(self.recv) | |||
return result | return result | |||
def remote_set_view(view,_self=cmd): | def remote_set_view(view,_self=cmd): | |||
try: | try: | |||
skipping to change at line 125 | skipping to change at line 131 | |||
server_address = ('', port) | server_address = ('', port) | |||
ddbs = _PyMOLReader(server_address, _PyMOLRequestHandler) | ddbs = _PyMOLReader(server_address, _PyMOLRequestHandler) | |||
# bind pymol instance to the reader | # bind pymol instance to the reader | |||
pymol.cmd.remote_set_view = remote_set_view | pymol.cmd.remote_set_view = remote_set_view | |||
ddbs.cmd = pymol.cmd | ddbs.cmd = pymol.cmd | |||
print " syncmol: reading from port %d"%(port) | print(" syncmol: reading from port %d"%(port)) | |||
# now serve requests forever | # now serve requests forever | |||
ddbs.keep_alive = 1 | ddbs.keep_alive = 1 | |||
while ddbs.keep_alive: | while ddbs.keep_alive: | |||
ddbs.handle_request() | ddbs.handle_request() | |||
class _PyMOLReader(SocketServer.ThreadingTCPServer): | class _PyMOLReader(SocketServer.ThreadingTCPServer): | |||
def server_bind(self): | def server_bind(self): | |||
"""Override server_bind to store the server name.""" | """Override server_bind to store the server name.""" | |||
SocketServer.ThreadingTCPServer.server_bind(self) | SocketServer.ThreadingTCPServer.server_bind(self) | |||
skipping to change at line 159 | skipping to change at line 165 | |||
self.server_port = port | self.server_port = port | |||
class _PyMOLRequestHandler(SocketServer.StreamRequestHandler): | class _PyMOLRequestHandler(SocketServer.StreamRequestHandler): | |||
def handle(self): | def handle(self): | |||
while self.server.keep_alive: | while self.server.keep_alive: | |||
# get method name from client | # get method name from client | |||
try: | try: | |||
method = cPickle.load(self.rfile) | method = cPickle.load(self.rfile) | |||
except EOFError,socket.error: | except (EOFError, socket.error): | |||
break | break | |||
if method == 'shutdown': | if method == 'shutdown': | |||
self.server.keep_alive = 0 | self.server.keep_alive = 0 | |||
# get arguments from client | # get arguments from client | |||
args = cPickle.load(self.rfile) | args = cPickle.load(self.rfile) | |||
kw = cPickle.load(self.rfile) | kw = cPickle.load(self.rfile) | |||
# get cmd method pointer | # get cmd method pointer | |||
meth_obj = getattr(self.server.cmd,method) | meth_obj = getattr(self.server.cmd,method) | |||
# call method and return result | # call method and return result | |||
cPickle.dump(apply(meth_obj,args,kw),self.wfile,1) # binary by defa ult | cPickle.dump(meth_obj(*args, **kw),self.wfile,1) # binary by defaul t | |||
self.wfile.flush() | self.wfile.flush() | |||
if __name__=='pymol': | if __name__=='pymol': | |||
import os | import os | |||
import pymol | import pymol | |||
sys.argv.reverse() | sys.argv.reverse() | |||
sys.argv.pop() | sys.argv.pop() | |||
while len(sys.argv): | while len(sys.argv): | |||
tok = sys.argv.pop() | tok = sys.argv.pop() | |||
if tok == 'recv': | if tok == 'recv': | |||
End of changes. 8 change blocks. | ||||
8 lines changed or deleted | 14 lines changed or added |