def _connect_hwserver(self): print self.hwr_directory self.hwr_server = HardwareRepository.HardwareRepository(self.hwr_directory) self.hwr_server.connect() hwo_path = os.path.join(self.mxcube_dir, "HardwareObjects") sc_hwo_path = os.path.join(hwo_path, "sample_changer") if self.institute: inst_hwo_path = os.path.join(hwo_path, self.institute) HardwareRepository.addHardwareObjectsDirs([hwo_path, inst_hwo_path, sc_hwo_path])
def _connect_hwserver(self): print self.hwr_directory self.hwr_server = HardwareRepository.HardwareRepository( self.hwr_directory) self.hwr_server.connect() hwo_path = os.path.join(self.mxcube_dir, "HardwareObjects") sc_hwo_path = os.path.join(hwo_path, "sample_changer") if self.institute: inst_hwo_path = os.path.join(hwo_path, self.institute) HardwareRepository.addHardwareObjectsDirs( [hwo_path, inst_hwo_path, sc_hwo_path])
def run(GUIConfigFile = None): """ Descript. : """ defaultHwrServer = 'localhost:hwr' userHomeDir = os.path.expanduser("~") #path to user's home dir. (works on Win2K, XP, Unix, Mac...) parser = OptionParser(usage = 'usage: %prog <GUI definition file> [options]') parser.add_option('', '--logFile', action = 'store', type = 'string', help = 'Log file', dest = 'logFile', metavar = 'FILE', default = '') parser.add_option('', '--logLevel', action = 'store', type = 'string', help = 'Log level', dest = 'logLevel', default = 'INFO') parser.add_option('', '--bricksDirs', action = 'store', type = 'string', help = 'Additional directories for bricks search path (you can also use the CUSTOM_BRICKS_PATH environment variable)', dest = 'bricksDirs', metavar = 'dir1'+os.path.pathsep+'dir2...dirN', default = '') parser.add_option('', '--hardwareRepository', action = 'store', type = 'string', help = 'Hardware Repository Server host:port (default to %s) (you can also use HARDWARE_REPOSITORY_SERVER the environment variable)' % defaultHwrServer, metavar = 'HOST:PORT', dest = 'hardwareRepositoryServer', default = '') parser.add_option('', '--hardwareObjectsDirs', action = 'store', type = 'string', help = 'Additional directories for Hardware Objects search path (you can also use the CUSTOM_HARDWARE_OBJECTS_PATH environment variable)', dest = 'hardwareObjectsDirs', metavar = 'dir1' + os.path.pathsep + 'dir2...dirN', default = '') parser.add_option('-d', '', action='store_true', dest="designMode", default=False, help="start GUI in Design mode") parser.add_option('-m', '', action='store_true', dest="showMaximized", default=False, help="maximize main window") parser.add_option('', '--no-border', action='store_true', dest='noBorder', default=False, help="does not show borders on main window") #parser.add_option('-s', '--syle', action='store', type="string", dest='style', default=0, help="GUI style") parser.add_option('-w', '--web-server-port', action='store', type="int", dest='webServerPort', default=0, help="port number for the remote interpreter web application server") #parser.add_option('', '--widgetcount', action='store_true', dest='widgetCount', default=False, help="prints debug message at the end about number of widgets left undestroyed") (opts, args) = parser.parse_args() if len(args) >= 1: if len(args) == 1: GUIConfigFile = os.path.abspath(args[0]) else: parser.error('Too many arguments.') sys.exit(1) """if opts.webServerPort: interpreter = terminal_server.InteractiveInterpreter() terminal_server.set_interpreter(interpreter) gevent.spawn(terminal_server.serve_forever, opts.webServerPort)""" # # get config from arguments # logFile = opts.logFile hoDirs = opts.hardwareObjectsDirs.split(os.path.pathsep) bricksDirs = opts.bricksDirs.split(os.path.pathsep) if opts.hardwareRepositoryServer: hwrServer = opts.hardwareRepositoryServer else: # # try to set Hardware Repository server from environment # try: hwrServer = os.environ['HARDWARE_REPOSITORY_SERVER'] except KeyError: hwrServer = defaultHwrServer # # add bricks directories and hardware objects directories from environment # try: bricksDirs += os.environ['CUSTOM_BRICKS_PATH'].split(os.path.pathsep) except KeyError: pass try: hoDirs += os.environ['CUSTOM_HARDWARE_OBJECTS_PATH'].split(os.path.pathsep) except KeyError: pass bricksDirs = filter(None, bricksDirs) hoDirs = filter(None, hoDirs) app = QtGui.QApplication([]) lockfile = None if not opts.designMode and GUIConfigFile: lock_filename=os.path.join(tempfile.gettempdir(), '.%s.lock' % os.path.basename(GUIConfigFile or "unnamed")) try: lockfile = open(lock_filename, "w") except: logging.getLogger().exception("Cannot create lock file (%s), exiting" % lock_filename) sys.exit(1) else: os.chmod(lock_filename,0666) try: fcntl.lockf(lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: logging.getLogger().exception("Cannot acquire lock (%s), exiting (hint: maybe the same application is already running ?)" % lock_filename) sys.exit(1) # # configure modules # HardwareRepository.setHardwareRepositoryServer(hwrServer) HardwareRepository.addHardwareObjectsDirs(hoDirs) BlissFramework.addCustomBricksDirs(bricksDirs) # # set log name and log file # if GUIConfigFile: BlissFramework.setLoggingName(os.path.basename(GUIConfigFile)) log_lockfile = None if len(logFile) > 0: log_lock_filename=os.path.join(tempfile.gettempdir(), '.%s.lock' % os.path.basename(logFile)) log_ok=True try: log_lockfile = open(log_lock_filename, "w") except: log_ok=False else: try: os.chmod(log_lock_filename,0666) except: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: log_ok=False try: log_lockfile.close() except: pass if not log_ok: i=1 logfile_details=os.path.splitext(logFile) logFile="" while i<10: logFile2="%s.%d%s" % (logfile_details[0],i,logfile_details[1]) log_lock_filename2=os.path.join(tempfile.gettempdir(), '.%s.lock' % os.path.basename(logFile2)) try: log_lockfile = open(log_lock_filename2, "w") except: pass else: try: os.chmod(log_lock_filename2,0666) except: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: pass else: log_ok=True if log_ok: logFile=logFile2 break i+=1 if len(logFile) > 0: BlissFramework.setLogFile(logFile) # # log startup details # logLevel = getattr(logging, opts.logLevel) logging.getLogger().setLevel(logLevel) logInfo = 'Qt4 GUI started (%s)' % (GUIConfigFile or "unnamed") logInfo += ', HWRSERVER=%s' % hwrServer if len(hoDirs) > 0: logInfo += ', HODIRS=%s' % os.path.pathsep.join(hoDirs) if len(bricksDirs) > 0: logInfo += ', BRICKSDIRS=%s' % os.path.pathsep.join(bricksDirs) logging.getLogger().info(logInfo) QtGui.QApplication.setDesktopSettingsAware(False) #use default settings QtCore.QObject.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app.quit) supervisor = Qt4_GUISupervisor.GUISupervisor(designMode = opts.designMode, showMaximized=opts.showMaximized, noBorder=opts.noBorder) #BlissFramework.setDebugMode(True) # # post event for GUI creation # #pp.postEvent(supervisor, QtCore.QEvent(Qt4_GUISupervisor.LOAD_GUI_EVENT, GUIConfigFile)) app.postEvent(supervisor, MyCustomEvent(Qt4_GUISupervisor.LOAD_GUI_EVENT, GUIConfigFile)) # # redirect errors to logger # Qt4_ErrorHandler.enableStdErrRedirection() gevent_timer = QtCore.QTimer() gevent_timer.connect(gevent_timer, QtCore.SIGNAL("timeout()"), do_gevent) gevent_timer.start(0) app.setOrganizationName("MXCuBE") app.setOrganizationDomain("https://github.com/mxcube") app.setApplicationName("MXCuBE") #app.setWindowIcon(QIcon("images/icon.png")) app.exec_() """ def process_qt_events(): while True: time.sleep(0.01) while app.hasPendingEvents(): app.processEvents() time.sleep(0.01) if not app.mainWidget() or not app.mainWidget().isVisible(): return qt_events = gevent.spawn(process_qt_events) qt_events.join() """ supervisor.finalize() if lockfile is not None: filename = lockfile.name try: lockfile.close() os.unlink(filename) except: logging.getLogger().error("Problem removing the lock file") if log_lockfile is not None: filename = log_lockfile.name try: log_lockfile.close() os.unlink(filename) except: logging.getLogger().exception("Problem removing the log lock file")
def run(gui_config_file=None): """Main run method""" default_hwr_path = "localhost:hwr" # path to user's home dir. (works on Win2K, XP, Unix, Mac...) parser = OptionParser(usage="usage: %prog <GUI definition file> [options]") parser.add_option( "", "--logFile", action="store", type="string", help="Log file", dest="logFile", metavar="FILE", default="", ) parser.add_option( "", "--logLevel", action="store", type="string", help="Log level", dest="logLevel", default="INFO", ) parser.add_option( "", "--logTemplate", action="store", type="string", help="Log template", dest="logTemplate", default="", ) parser.add_option( "", "--bricksDirs", action="store", type="string", help="Additional directories for bricks search " + "path (you can also use the CUSTOM_BRICKS_PATH " + "environment variable)", dest="bricksDirs", metavar="dir1" + os.path.pathsep + "dir2...dirN", default="", ) parser.add_option( "", "--hardwareRepository", action="store", type="string", help="Hardware Repository Server host:port (default" + " to %s) (you can also use " % default_hwr_path + "HARDWARE_REPOSITORY_SERVER the environment variable)", metavar="HOST:PORT", dest="hardwareRepositoryServer", default="", ) parser.add_option( "", "--hardwareObjectsDirs", action="store", type="string", help="Additional directories for " + "Hardware Objects search path (you can also use " + "the CUSTOM_HARDWARE_OBJECTS_PATH environment " + "variable)", dest="hardwareObjectsDirs", metavar="dir1" + os.path.pathsep + "dir2...dirN", default="", ) parser.add_option( "-d", "", action="store_true", dest="designMode", default=False, help="start GUI in Design mode", ) parser.add_option( "-m", "", action="store_true", dest="showMaximized", default=False, help="maximize main window", ) parser.add_option( "", "--no-border", action="store_true", dest="noBorder", default=False, help="does not show borders on main window", ) parser.add_option( "", "--style", action="store", type="string", help="Visual style of the application (windows, motif," + "cde, plastique, windowsxp, or macintosh)", dest="appStyle", default=None, ) parser.add_option( "", "--userFileDir", action="store", type="string", help="User settings file stores application related settings " + "(window size and position). If not defined then user home " + "directory is used", dest="userFileDir", default=None, ) parser.add_option("", "--pyqt4", action="store_true", default=None) parser.add_option("", "--pyqt5", action="store_true", default=None) parser.add_option("", "--pyside", action="store_true", default=None) (opts, args) = parser.parse_args() # get config from arguments log_file = opts.logFile log_template = opts.logTemplate hwobj_directories = opts.hardwareObjectsDirs.split(os.path.pathsep) custom_bricks_directories = opts.bricksDirs.split(os.path.pathsep) if opts.userFileDir: user_file_dir = opts.userFileDir else: user_file_dir = os.path.join(os.environ["HOME"], ".mxcube") app_style = opts.appStyle if opts.hardwareRepositoryServer: hwr_path = opts.hardwareRepositoryServer else: # try to set Hardware Repository server from environment hwr_path = os.environ.get("HARDWARE_REPOSITORY_SERVER") if hwr_path is None: hwr_path = default_hwr_path # add bricks directories and hardware objects directories from environment try: custom_bricks_directories += os.environ.get("CUSTOM_BRICKS_PATH", "").split( os.path.pathsep ) except KeyError: pass try: hwobj_directories += os.environ.get("CUSTOM_HARDWARE_OBJECTS_PATH", "").split( os.path.pathsep ) except KeyError: pass try: if not os.path.exists(user_file_dir): os.makedirs(user_file_dir) except BaseException: logging.getLogger().exception( "Unable to create user files directory: %s" % user_file_dir ) custom_bricks_directories = [ _directory for _directory in custom_bricks_directories if _directory ] hwobj_directories = [_directory for _directory in hwobj_directories if _directory] main_application = QtImport.QApplication([]) if app_style: main_application.setStyle(app_style) if len(args) >= 1: if len(args) == 1: gui_config_file = os.path.abspath(args[0]) else: parser.error("Too many arguments.") sys.exit(1) if ( len( os.popen( "ps -aef | grep 'python' -i | grep 'hardwareRepository'" +\ " | grep -v 'grep' | awk '{ print $3 }'" ) .read() .strip() .split("\n") ) > 1 ): QtImport.QMessageBox.warning( None, "Warning", "Another instance of MXCuBE is running.\n", QtImport.QMessageBox.Ok, ) #sys.exit(1) # configure modules HardwareRepository.setHardwareRepositoryServer(hwr_path) HardwareRepository.setUserFileDirectory(user_file_dir) if hwobj_directories: HardwareRepository.addHardwareObjectsDirs(hwobj_directories) if custom_bricks_directories: gui.add_custom_bricks_dirs(custom_bricks_directories) log_lockfile = None if len(log_file) > 0: if gui_config_file: gui.set_logging_name(os.path.basename(gui_config_file), log_template) log_lock_filename = os.path.join( tempfile.gettempdir(), ".%s.lock" % os.path.basename(log_file) ) log_ok = True try: log_lockfile = open(log_lock_filename, "w") except BaseException: log_ok = False else: try: os.chmod(log_lock_filename, 0o666) except BaseException: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except BaseException: log_ok = False try: log_lockfile.close() except BaseException: pass if not log_ok: index = 1 logfile_details = os.path.splitext(log_file) log_file = "" while index < 10: log_file2 = "%s.%d%s" % (logfile_details[0], index, logfile_details[1]) log_lock_filename2 = os.path.join( tempfile.gettempdir(), ".%s.lock" % os.path.basename(log_file2) ) try: log_lockfile = open(log_lock_filename2, "w") except BaseException: pass else: try: os.chmod(log_lock_filename2, 0o666) except BaseException: pass try: fcntl.lockf( log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB ) except BaseException: pass else: log_ok = True if log_ok: log_file = log_file2 break index += 1 gui.set_log_file(log_file) # log startup details log_level = getattr(logging, opts.logLevel) logging.getLogger().setLevel(log_level) # logging.getLogger().info("\n\n\n\n") logging.getLogger("HWR").info( "==============================================================================" ) logging.getLogger("HWR").info("Starting MXCuBE v%s" % str(__version__)) logging.getLogger("HWR").info("GUI file: %s" % (gui_config_file or "unnamed")) logging.getLogger("HWR").info("Hardware repository: %s" % hwr_path) logging.getLogger("HWR").info("User file directory: %s" % user_file_dir) if len(log_file) > 0: logging.getLogger("HWR").info("Log file: %s" % log_file) logging.getLogger("HWR").info("System info:") logging.getLogger("HWR").info( " - Python %s on %s" % (platform.python_version(), platform.system()) ) logging.getLogger("HWR").info( " - Qt %s - %s %s" % ( "%d.%d.%d" % tuple(QtImport.qt_version_no), QtImport.qt_variant, "%d.%d.%d" % tuple(QtImport.pyqt_version_no), ) ) if QtImport.mpl_imported: logging.getLogger("HWR").info( " - Matplotlib %s" % "%d.%d.%d" % tuple(QtImport.mpl_version_no) ) else: logging.getLogger("HWR").info(" - Matplotlib not available") logging.getLogger("HWR").info( "------------------------------------------------------------------------------" ) QtImport.QApplication.setDesktopSettingsAware(False) main_application.lastWindowClosed.connect(main_application.quit) supervisor = GUISupervisor.GUISupervisor( design_mode=opts.designMode, show_maximized=opts.showMaximized, no_border=opts.noBorder, ) api.init(hwr_path) supervisor.set_user_file_directory(user_file_dir) # post event for GUI creation main_application.postEvent( supervisor, MyCustomEvent(GUISupervisor.LOAD_GUI_EVENT, gui_config_file) ) # redirect errors to logger ErrorHandler.enable_std_err_redirection() gevent_timer = QtImport.QTimer() gevent_timer.timeout.connect(do_gevent) gevent_timer.start(0) palette = main_application.palette() palette.setColor(QtImport.QPalette.ToolTipBase, QtImport.QColor(255, 241, 204)) palette.setColor(QtImport.QPalette.ToolTipText, QtImport.Qt.black) main_application.setPalette(palette) main_application.setOrganizationName("MXCuBE") main_application.setOrganizationDomain("https://github.com/mxcube") main_application.setApplicationName("MXCuBE") # app.setWindowIcon(QtImport.QIcon("images/icon.png")) main_application.exec_() supervisor.finalize() if log_lockfile is not None: filename = log_lockfile.name try: log_lockfile.close() os.unlink(filename) except BaseException: logging.getLogger().exception("Problem removing the log lock file")
def run(gui_config_file=None): """Main run method""" default_hwr_server = 'localhost:hwr' #path to user's home dir. (works on Win2K, XP, Unix, Mac...) parser = OptionParser(usage="usage: %prog <GUI definition file> [options]") parser.add_option('', '--logFile', action='store', type='string', help='Log file', dest='logFile', metavar='FILE', default='') parser.add_option('', '--logLevel', action='store', type='string', help='Log level', dest='logLevel', default='INFO') parser.add_option('', '--logTemplate', action='store', type='string', help='Log template', dest='logTemplate', default='') parser.add_option('', '--bricksDirs', action='store', type='string', help="Additional directories for bricks search " + \ "path (you can also use the CUSTOM_BRICKS_PATH " + \ "environment variable)", dest='bricksDirs', metavar='dir1'+os.path.pathsep+\ 'dir2...dirN', default='') parser.add_option('', '--hardwareRepository', action='store', type='string', help="Hardware Repository Server host:port (default" + \ " to %s) (you can also use " % default_hwr_server+ \ "HARDWARE_REPOSITORY_SERVER the environment variable)", metavar='HOST:PORT', dest='hardwareRepositoryServer', default='') parser.add_option('', '--hardwareObjectsDirs', action='store', type='string', help="Additional directories for " + \ "Hardware Objects search path (you can also use " + \ "the CUSTOM_HARDWARE_OBJECTS_PATH environment " + \ "variable)", dest='hardwareObjectsDirs', metavar='dir1'+os.path.pathsep+'dir2...dirN', default='') parser.add_option('-d', '', action='store_true', dest="designMode", default=False, help="start GUI in Design mode") parser.add_option('-m', '', action='store_true', dest="showMaximized", default=False, help="maximize main window") parser.add_option('', '--no-border', action='store_true', dest='noBorder', default=False, help="does not show borders on main window") parser.add_option('', '--style', action='store', type='string', help="Visual style of the application (windows, motif," + \ "cde, plastique, windowsxp, or macintosh)", dest='appStyle', default=None) parser.add_option('', '--userFileDir', action='store', type='string', help="User settings file stores application related settings " + \ "(window size and position). If not defined then user home " + \ "directory is used", dest='userFileDir', default=None) parser.add_option('', '--pyqt4', action='store_true', default=None) parser.add_option('', '--pyqt5', action='store_true', default=None) parser.add_option('', '--pyside', action='store_true', default=None) (opts, args) = parser.parse_args() if len(args) >= 1: if len(args) == 1: gui_config_file = os.path.abspath(args[0]) else: parser.error('Too many arguments.') sys.exit(1) # get config from arguments logFile = opts.logFile log_template = opts.logTemplate hwobj_directories = opts.hardwareObjectsDirs.split(os.path.pathsep) custom_bricks_directories = opts.bricksDirs.split(os.path.pathsep) if opts.userFileDir: user_file_dir = opts.userFileDir else: user_file_dir = os.path.join(os.environ["HOME"], ".mxcube") app_style = opts.appStyle if opts.hardwareRepositoryServer: hwr_server = opts.hardwareRepositoryServer else: # try to set Hardware Repository server from environment hwr_server = os.environ.get('HARDWARE_REPOSITORY_SERVER') if hwr_server is None: hwr_server = default_hwr_server # add bricks directories and hardware objects directories from environment try: custom_bricks_directories += \ os.environ.get('CUSTOM_BRICKS_PATH', '').split(os.path.pathsep) except KeyError: pass try: hwobj_directories += \ os.environ.get('CUSTOM_HARDWARE_OBJECTS_PATH', '').split(os.path.pathsep) except KeyError: pass try: if not os.path.exists(user_file_dir): os.makedirs(user_file_dir) except: logging.getLogger().exception(\ "Unable to create user files directory: %s" % user_file_dir) custom_bricks_directories = [_directory for _directory in \ custom_bricks_directories if _directory] hwobj_directories = [_directory for _directory in \ hwobj_directories if _directory] main_application = QApplication([]) if app_style: main_application.setStyle(app_style) lockfile = None if not opts.designMode and gui_config_file: lock_filename = os.path.join(tempfile.gettempdir(), '.%s.lock' % \ os.path.basename(gui_config_file or "unnamed")) try: lockfile = open(lock_filename, "w") except: logging.getLogger().exception(\ "Cannot create lock file (%s), exiting" % lock_filename) sys.exit(1) else: os.chmod(lock_filename, 0666) try: fcntl.lockf(lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: logging.getLogger().exception("Cannot acquire " + \ "lock (%s), exiting " % lock_filename + \ "(hint: maybe the same application is already running ?)") sys.exit(1) # configure modules HardwareRepository.setHardwareRepositoryServer(hwr_server) HardwareRepository.setUserFileDirectory(user_file_dir) if hwobj_directories: HardwareRepository.addHardwareObjectsDirs(hwobj_directories) if custom_bricks_directories: BlissFramework.addCustomBricksDirs(custom_bricks_directories) # set log name and log file if gui_config_file: BlissFramework.setLoggingName(os.path.basename(gui_config_file), log_template) log_lockfile = None if len(logFile) > 0: log_lock_filename = os.path.join(tempfile.gettempdir(), '.%s.lock' % os.path.basename(logFile)) log_ok = True try: log_lockfile = open(log_lock_filename, "w") except: log_ok = False else: try: os.chmod(log_lock_filename, 0o666) except: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: log_ok = False try: log_lockfile.close() except: pass if not log_ok: index = 1 logfile_details = os.path.splitext(logFile) logFile = "" while index < 10: logFile2 = "%s.%d%s" % (logfile_details[0], index, logfile_details[1]) log_lock_filename2 = os.path.join(tempfile.gettempdir(), '.%s.lock' % os.path.basename(logFile2)) try: log_lockfile = open(log_lock_filename2, "w") except: pass else: try: os.chmod(log_lock_filename2, 0o666) except: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: pass else: log_ok = True if log_ok: logFile = logFile2 break index += 1 if len(logFile) > 0: BlissFramework.setLogFile(logFile) # log startup details log_level = getattr(logging, opts.logLevel) logging.getLogger().setLevel(log_level) #logging.getLogger().info("\n\n\n\n") logging.getLogger().info("=================================================================================") logging.getLogger().info("Starting MXCuBE v%s" % str(__version__)) logging.getLogger().info("GUI file: %s" % (gui_config_file or "unnamed")) logging.getLogger().info("Hardware repository: %s" % hwr_server) logging.getLogger().info("User file directory: %s" % user_file_dir) if len(logFile) > 0: logging.getLogger().info("Log file: %s" % logFile) logging.getLogger().info("System info:") logging.getLogger().info(" - Python %s on %s" %(platform.python_version(), platform.system())) logging.getLogger().info(" - Qt %s - %s %s" % \ ("%d.%d.%d" % tuple(qt_version_no), qt_variant, "%d.%d.%d" % tuple(pyqt_version_no)) ) if mpl_imported: logging.getLogger().info(" - Matplotlib %s" % "%d.%d.%d" % tuple(mpl_version_no)) else: logging.getLogger().info(" - Matplotlib not available") logging.getLogger().info("---------------------------------------------------------------------------------") QApplication.setDesktopSettingsAware(False) main_application.lastWindowClosed.connect(main_application.quit) supervisor = Qt4_GUISupervisor.GUISupervisor(design_mode=opts.designMode, show_maximized=opts.showMaximized, no_border=opts.noBorder) supervisor.set_user_file_directory(user_file_dir) # post event for GUI creation main_application.postEvent(supervisor, MyCustomEvent(Qt4_GUISupervisor.LOAD_GUI_EVENT, gui_config_file)) # redirect errors to logger Qt4_ErrorHandler.enableStdErrRedirection() gevent_timer = QTimer() gevent_timer.timeout.connect(do_gevent) gevent_timer.start(0) palette = main_application.palette() palette.setColor(QPalette.ToolTipBase, QColor(255, 241, 204)) palette.setColor(QPalette.ToolTipText, Qt.black) main_application.setPalette(palette) main_application.setOrganizationName("MXCuBE") main_application.setOrganizationDomain("https://github.com/mxcube") main_application.setApplicationName("MXCuBE") #app.setWindowIcon(QIcon("images/icon.png")) main_application.exec_() supervisor.finalize() if lockfile is not None: filename = lockfile.name try: lockfile.close() os.unlink(filename) except: logging.getLogger().error("Problem removing the lock file") if log_lockfile is not None: filename = log_lockfile.name try: log_lockfile.close() os.unlink(filename) except: logging.getLogger().exception("Problem removing the log lock file")
import gevent from optparse import OptionParser from flask import Flask, request, session from flask_socketio import SocketIO from flask_session import Session # To make "from HardwareRepository import ..." possible fname = os.path.dirname(__file__) sys.path.insert(0, fname) from HardwareRepository import HardwareRepository as hwr hwr.addHardwareObjectsDirs([os.path.join(fname, "HardwareObjects")]) import app as mxcube from config import Config sys.modules["Qub"] = mock.Mock() sys.modules["Qub.CTools"] = mock.Mock() XML_DIR = os.path.join( os.path.join(os.path.dirname(__file__), os.pardir), "test/HardwareObjectsMockup.xml/", ) opt_parser = OptionParser() opt_parser.add_option(
# def getStdHardwareObjectsPath(): import HardwareObjects # first looks in containing package return os.path.dirname(HardwareObjects.__file__) sys.path.insert(0, getStdHardwareObjectsPath()) hwobj_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "HardwareObjects") hwobj_dir_list = [hwobj_dir] for subdir in ("sample_changer", "mockup"): hwobj_dir_list.append(os.path.join(hwobj_dir, subdir)) HardwareRepository.addHardwareObjectsDirs(hwobj_dir_list) # # create the HardwareRepository logger # _hwr_logger = logging.getLogger("HWR") _hwr_logger.setLevel(logging.DEBUG) _oldLevel = logging.DEBUG _hwr_formatter = logging.Formatter("%(asctime)s |%(levelname)-7s| %(message)s") if len(logging.root.handlers) == 0: # # log to stdout # _hdlr = logging.StreamHandler(sys.stdout) _hdlr.setFormatter(_hwr_formatter)
def getStdHardwareObjectsPath(): import HardwareObjects # first looks in containing package return os.path.dirname(HardwareObjects.__file__) sys.path.insert(0, getStdHardwareObjectsPath()) hwobj_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "HardwareObjects") hwobj_dir_list = [hwobj_dir] for subdir in ("sample_changer", "mockup"): hwobj_dir_list.append(os.path.join(hwobj_dir, subdir)) HWR.addHardwareObjectsDirs(hwobj_dir_list) # # create the HardwareRepository logger # _hwr_logger = logging.getLogger("HWR") _hwr_logger.setLevel(logging.DEBUG) _oldLevel = logging.DEBUG _hwr_formatter = logging.Formatter("%(asctime)s |%(levelname)-7s| %(message)s") if len(logging.root.handlers) == 0: # # log to stdout # _hdlr = logging.StreamHandler(sys.stdout) _hdlr.setFormatter(_hwr_formatter)
from HardwareRepository.BaseHardwareObjects import HardwareObject __credits__ = ["MXCuBE colaboration"] __version__ = "2.2." cwd = os.getcwd() hwr_server = cwd + "/ExampleFiles/HardwareObjects.xml" print "===============================================================" print "MXCuBE home directory: %s" % cwd print "Hardware repository: %s" % hwr_server HardwareRepository.setHardwareRepositoryServer(hwr_server) hardware_repository = HardwareRepository.HardwareRepository() hardware_repository.connect() HardwareRepository.addHardwareObjectsDirs([cwd + "/HardwareObjects"]) unittest_hwobj = hardware_repository.getHardwareObject("unittest") if unittest_hwobj is not None: print "UnitTest hardware object loaded" else: print "Unable to load UnitTest hardware object!" print "Check if unittest.xml is in %s" % hwr_server print "===============================================================" class TestException(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value)
sess = Session() sess.init_app(app) app.debug = False # this line important for socketio msg, otherwise no msg is sent... socketio.init_app(app) # the following test prevents Flask from initializing twice # (because of the Reloader) if not app.debug or os.environ.get("WERKZEUG_RUN_MAIN") == "true": ###Initialization of the HardwareObjects # this is to allow Hardware Objects to do # 'from HardwareRepository import ...' sys.path.insert(0, os.path.dirname(__file__)) from HardwareRepository import HardwareRepository as hwr, removeLoggingHandlers removeLoggingHandlers() hwr.addHardwareObjectsDirs( [os.path.join(os.path.dirname(__file__), 'HardwareObjects')]) hwr_directory = cmdline_options.hwr_directory hwr = hwr.HardwareRepository( os.path.abspath(os.path.expanduser(hwr_directory))) hwr.connect() log_formatter = logging.Formatter( '%(asctime)s |%(name)-7s|%(levelname)-7s| %(message)s') log_file = cmdline_options.log_file if log_file: log_file_handler = TimedRotatingFileHandler(log_file, when='midnight', backupCount=1) os.chmod(log_file, 0o666) log_file_handler.setFormatter(log_formatter)
def run(gui_config_file=None): """Main run method""" default_hwr_server = 'localhost:hwr' #path to user's home dir. (works on Win2K, XP, Unix, Mac...) parser = OptionParser(usage="usage: %prog <GUI definition file> [options]") parser.add_option('', '--logFile', action='store', type='string', help='Log file', dest='logFile', metavar='FILE', default='') parser.add_option('', '--logLevel', action='store', type='string', help='Log level', dest='logLevel', default='INFO') parser.add_option('', '--logTemplate', action='store', type='string', help='Log template', dest='logTemplate', default='') parser.add_option('', '--bricksDirs', action='store', type='string', help="Additional directories for bricks search " + \ "path (you can also use the CUSTOM_BRICKS_PATH " + \ "environment variable)", dest='bricksDirs', metavar='dir1'+os.path.pathsep+\ 'dir2...dirN', default='') parser.add_option('', '--hardwareRepository', action='store', type='string', help="Hardware Repository Server host:port (default" + \ " to %s) (you can also use " % default_hwr_server+ \ "HARDWARE_REPOSITORY_SERVER the environment variable)", metavar='HOST:PORT', dest='hardwareRepositoryServer', default='') parser.add_option('', '--hardwareObjectsDirs', action='store', type='string', help="Additional directories for " + \ "Hardware Objects search path (you can also use " + \ "the CUSTOM_HARDWARE_OBJECTS_PATH environment " + \ "variable)", dest='hardwareObjectsDirs', metavar='dir1'+os.path.pathsep+'dir2...dirN', default='') parser.add_option('-d', '', action='store_true', dest="designMode", default=False, help="start GUI in Design mode") parser.add_option('-m', '', action='store_true', dest="showMaximized", default=False, help="maximize main window") parser.add_option('', '--no-border', action='store_true', dest='noBorder', default=False, help="does not show borders on main window") parser.add_option('', '--style', action='store', type='string', help="Visual style of the application (windows, motif," + \ "cde, plastique, windowsxp, or macintosh)", dest='appStyle', default=None) parser.add_option('', '--userFileDir', action='store', type='string', help="User settings file stores application related settings " + \ "(window size and position). If not defined then user home " + \ "directory is used", dest='userFileDir', default=None) parser.add_option('', '--pyqt4', action='store_true', default=None) parser.add_option('', '--pyqt5', action='store_true', default=None) parser.add_option('', '--pyside', action='store_true', default=None) (opts, args) = parser.parse_args() if len(args) >= 1: if len(args) == 1: gui_config_file = os.path.abspath(args[0]) else: parser.error('Too many arguments.') sys.exit(1) # get config from arguments logFile = opts.logFile log_template = opts.logTemplate hwobj_directory = opts.hardwareObjectsDirs.split(os.path.pathsep) custom_bricks_directory = opts.bricksDirs.split(os.path.pathsep) if opts.userFileDir: user_file_dir = opts.userFileDir else: user_file_dir = os.path.join(os.environ["HOME"], ".mxcube") app_style = opts.appStyle if opts.hardwareRepositoryServer: hwr_server = opts.hardwareRepositoryServer else: # try to set Hardware Repository server from environment try: hwr_server = os.environ.get('HARDWARE_REPOSITORY_SERVER', '') except KeyError: hwr_server = default_hwr_server # add bricks directories and hardware objects directories from environment try: custom_bricks_directory += \ os.environ.get('CUSTOM_BRICKS_PATH', '').split(os.path.pathsep) except KeyError: pass try: hwobj_directory += \ os.environ.get('CUSTOM_HARDWARE_OBJECTS_PATH', '').split(os.path.pathsep) except KeyError: pass try: if not os.path.exists(user_file_dir): os.makedirs(user_file_dir) except: logging.getLogger().exception(\ "Unable to create user files directory: %s" % user_file_dir) custom_bricks_directory = [_directory for _directory in \ custom_bricks_directory if _directory] hwobj_directory = [_directory for _directory in \ hwobj_directory if _directory] main_application = QApplication([]) if app_style: main_application.setStyle(app_style) lockfile = None if not opts.designMode and gui_config_file: lock_filename = os.path.join(tempfile.gettempdir(), '.%s.lock' % \ os.path.basename(gui_config_file or "unnamed")) try: lockfile = open(lock_filename, "w") except: logging.getLogger().exception(\ "Cannot create lock file (%s), exiting" % lock_filename) sys.exit(1) else: os.chmod(lock_filename, 0o666) try: fcntl.lockf(lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: logging.getLogger().exception("Cannot acquire " + \ "lock (%s), exiting " % lock_filename + \ "(hint: maybe the same application is already running ?)") sys.exit(1) # configure modules HardwareRepository.setHardwareRepositoryServer(hwr_server) HardwareRepository.addHardwareObjectsDirs(hwobj_directory) HardwareRepository.setUserFileDirectory(user_file_dir) BlissFramework.addCustomBricksDirs(custom_bricks_directory) # set log name and log file if gui_config_file: BlissFramework.setLoggingName(os.path.basename(gui_config_file), log_template) log_lockfile = None if len(logFile) > 0: log_lock_filename = os.path.join(tempfile.gettempdir(), '.%s.lock' % os.path.basename(logFile)) log_ok = True try: log_lockfile = open(log_lock_filename, "w") except: log_ok = False else: try: os.chmod(log_lock_filename, 0o666) except: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: log_ok = False try: log_lockfile.close() except: pass if not log_ok: index = 1 logfile_details = os.path.splitext(logFile) logFile = "" while index < 10: logFile2 = "%s.%d%s" % (logfile_details[0], index, logfile_details[1]) log_lock_filename2 = os.path.join(tempfile.gettempdir(), '.%s.lock' % os.path.basename(logFile2)) try: log_lockfile = open(log_lock_filename2, "w") except: pass else: try: os.chmod(log_lock_filename2, 0o666) except: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: pass else: log_ok = True if log_ok: logFile = logFile2 break index += 1 if len(logFile) > 0: BlissFramework.setLogFile(logFile) # log startup details log_level = getattr(logging, opts.logLevel) logging.getLogger().setLevel(log_level) #logging.getLogger().info("\n\n\n\n") logging.getLogger().info("=================================================================================") logging.getLogger().info("Starting MXCuBE v%s" % str(__version__)) logging.getLogger().info("GUI file: %s" % (gui_config_file or "unnamed")) logging.getLogger().info("Hardware repository: %s" % hwr_server) logging.getLogger().info("User file directory: %s" % user_file_dir) if len(logFile) > 0: logging.getLogger().info("Log file: %s" % logFile) logging.getLogger().info("System info:") logging.getLogger().info(" - Python %s on %s" %(platform.python_version(), platform.system())) logging.getLogger().info(" - Qt %s - %s %s" % \ ("%d.%d.%d" % tuple(qt_version_no), qt_variant, "%d.%d.%d" % tuple(pyqt_version_no)) ) if mpl_imported: logging.getLogger().info(" - Matplotlib %s" % "%d.%d.%d" % tuple(mpl_version_no)) else: logging.getLogger().info(" - Matplotlib not available") logging.getLogger().info("---------------------------------------------------------------------------------") QApplication.setDesktopSettingsAware(False) main_application.lastWindowClosed.connect(main_application.quit) supervisor = Qt4_GUISupervisor.GUISupervisor(design_mode=opts.designMode, show_maximized=opts.showMaximized, no_border=opts.noBorder) supervisor.set_user_file_directory(user_file_dir) # post event for GUI creation main_application.postEvent(supervisor, MyCustomEvent(Qt4_GUISupervisor.LOAD_GUI_EVENT, gui_config_file)) # redirect errors to logger Qt4_ErrorHandler.enableStdErrRedirection() gevent_timer = QTimer() gevent_timer.timeout.connect(do_gevent) gevent_timer.start(0) main_application.setOrganizationName("MXCuBE") main_application.setOrganizationDomain("https://github.com/mxcube") main_application.setApplicationName("MXCuBE") #app.setWindowIcon(QIcon("images/icon.png")) main_application.exec_() #gevent_timer = QTimer() #gevent_timer.timeout.connect(do_gevent) #gevent_timer.start(0) supervisor.finalize() if lockfile is not None: filename = lockfile.name try: lockfile.close() os.unlink(filename) except: logging.getLogger().error("Problem removing the lock file") if log_lockfile is not None: filename = log_lockfile.name try: log_lockfile.close() os.unlink(filename) except: logging.getLogger().exception("Problem removing the log lock file")
import gevent from optparse import OptionParser from flask import Flask, request from flask_socketio import SocketIO from flask_session import Session # To make "from HardwareRepository import ..." possible fname = os.path.dirname(__file__) sys.path.insert(0, fname) from HardwareRepository import HardwareRepository as hwr hwr.addHardwareObjectsDirs([os.path.join(fname, 'HardwareObjects')]) import app as mxcube sys.modules["Qub"] = mock.Mock() sys.modules["Qub.CTools"] = mock.Mock() XML_DIR = os.path.join(os.path.join(os.path.dirname(__file__), os.pardir), "test/HardwareObjectsMockup.xml/") opt_parser = OptionParser() opt_parser.add_option("-r", "--repository", dest="hwr_directory", help="Hardware Repository XML files path", default=XML_DIR)
def run(GUIConfigFile=None): defaultHwrServer = "localhost:hwr" # path to user's home dir. (works on Win2K, XP, Unix, Mac...) userHomeDir = os.path.expanduser("~") parser = OptionParser(usage="usage: %prog <GUI definition file> [options]") parser.add_option( "", "--logFile", action="store", type="string", help="Log file", dest="logFile", metavar="FILE", default="", ) parser.add_option( "", "--logLevel", action="store", type="string", help="Log level", dest="logLevel", default="INFO", ) parser.add_option( "", "--bricksDirs", action="store", type="string", help="Additional directories for bricks search path (you can also use the CUSTOM_BRICKS_PATH environment variable)", dest="bricksDirs", metavar="dir1" + os.path.pathsep + "dir2...dirN", default="", ) parser.add_option( "", "--hardwareRepository", action="store", type="string", help="Hardware Repository Server host:port (default to %s) (you can also use HARDWARE_REPOSITORY_SERVER the environment variable)" % defaultHwrServer, metavar="HOST:PORT", dest="hardwareRepositoryServer", default="", ) parser.add_option( "", "--hardwareObjectsDirs", action="store", type="string", help="Additional directories for Hardware Objects search path (you can also use the CUSTOM_HARDWARE_OBJECTS_PATH environment variable)", dest="hardwareObjectsDirs", metavar="dir1" + os.path.pathsep + "dir2...dirN", default="", ) parser.add_option( "-d", "", action="store_true", dest="designMode", default=False, help="start GUI in Design mode", ) parser.add_option( "-m", "", action="store_true", dest="showMaximized", default=False, help="maximize main window", ) parser.add_option( "", "--no-border", action="store_true", dest="noBorder", default=False, help="does not show borders on main window", ) parser.add_option( "-w", "--web-server-port", action="store", type="int", dest="webServerPort", default=0, help="port number for the remote interpreter web application server", ) # parser.add_option('', '--widgetcount', action='store_true', dest='widgetCount', default=False, help="prints debug message at the end about number of widgets left undestroyed") (opts, args) = parser.parse_args() if len(args) >= 1: if len(args) == 1: GUIConfigFile = os.path.abspath(args[0]) else: parser.error("Too many arguments.") sys.exit(1) if opts.webServerPort: from BlissFramework.Utils import terminal_server interpreter = terminal_server.InteractiveInterpreter() terminal_server.set_interpreter(interpreter) gevent.spawn(terminal_server.serve_forever, opts.webServerPort) # # get config from arguments # logFile = opts.logFile hoDirs = opts.hardwareObjectsDirs.split(os.path.pathsep) bricksDirs = opts.bricksDirs.split(os.path.pathsep) if opts.hardwareRepositoryServer: hwrServer = opts.hardwareRepositoryServer else: # # try to set Hardware Repository server from environment # try: hwrServer = os.environ["HARDWARE_REPOSITORY_SERVER"] except KeyError: hwrServer = defaultHwrServer # # add bricks directories and hardware objects directories from environment # try: bricksDirs += os.environ["CUSTOM_BRICKS_PATH"].split(os.path.pathsep) except KeyError: pass try: hoDirs += os.environ["CUSTOM_HARDWARE_OBJECTS_PATH"].split(os.path.pathsep) except KeyError: pass bricksDirs = filter(None, bricksDirs) hoDirs = filter(None, hoDirs) app = QApplication([]) lockfile = None if not opts.designMode and GUIConfigFile: lock_filename = os.path.join( tempfile.gettempdir(), ".%s.lock" % os.path.basename(GUIConfigFile or "unnamed"), ) try: lockfile = open(lock_filename, "w") except BaseException: logging.getLogger().exception( "Cannot create lock file (%s), exiting" % lock_filename ) sys.exit(1) else: os.chmod(lock_filename, 0o666) try: fcntl.lockf(lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except BaseException: logging.getLogger().exception( "Cannot acquire lock (%s), exiting (hint: maybe the same application is already running ?)" % lock_filename ) sys.exit(1) # # configure modules # HardwareRepository.setHardwareRepositoryServer(hwrServer) HardwareRepository.addHardwareObjectsDirs(hoDirs) BlissFramework.addCustomBricksDirs(bricksDirs) # # set log name and log file # if GUIConfigFile: BlissFramework.setLoggingName(os.path.basename(GUIConfigFile)) log_lockfile = None if len(logFile) > 0: log_lock_filename = os.path.join( tempfile.gettempdir(), ".%s.lock" % os.path.basename(logFile) ) log_ok = True try: log_lockfile = open(log_lock_filename, "w") except BaseException: log_ok = False else: try: os.chmod(log_lock_filename, 0o666) except BaseException: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except BaseException: log_ok = False try: log_lockfile.close() except BaseException: pass if not log_ok: i = 1 logfile_details = os.path.splitext(logFile) logFile = "" while i < 10: logFile2 = "%s.%d%s" % (logfile_details[0], i, logfile_details[1]) log_lock_filename2 = os.path.join( tempfile.gettempdir(), ".%s.lock" % os.path.basename(logFile2) ) try: log_lockfile = open(log_lock_filename2, "w") except BaseException: pass else: try: os.chmod(log_lock_filename2, 0o666) except BaseException: pass try: fcntl.lockf( log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB ) except BaseException: pass else: log_ok = True if log_ok: logFile = logFile2 break i += 1 if len(logFile) > 0: BlissFramework.setLogFile(logFile) # # log startup details # logLevel = getattr(logging, opts.logLevel) logging.getLogger().setLevel(logLevel) logInfo = "GUI started (%s)" % (GUIConfigFile or "unnamed") logInfo += ", HWRSERVER=%s" % hwrServer if len(hoDirs) > 0: logInfo += ", HODIRS=%s" % os.path.pathsep.join(hoDirs) if len(bricksDirs) > 0: logInfo += ", BRICKSDIRS=%s" % os.path.pathsep.join(bricksDirs) logging.getLogger().info(logInfo) QApplication.setDesktopSettingsAware(False) # use default settings QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()")) supervisor = GUISupervisor.GUISupervisor( designMode=opts.designMode, showMaximized=opts.showMaximized, noBorder=opts.noBorder, ) # BlissFramework.setDebugMode(True) # # post event for GUI creation # app.postEvent(supervisor, QCustomEvent(GUISupervisor.LOAD_GUI_EVENT, GUIConfigFile)) # # redirect errors to logger # ErrorHandler.enableStdErrRedirection() timer = QTimer() timer.connect(timer, SIGNAL("timeout()"), do_gevent) timer.start(0) app.exec_loop() """ def process_qt_events(): while True: time.sleep(0.01) while app.hasPendingEvents(): app.processEvents() time.sleep(0.01) if not app.mainWidget() or not app.mainWidget().isVisible(): return qt_events = gevent.spawn(process_qt_events) qt_events.join() """ supervisor.finalize() if lockfile is not None: filename = lockfile.name try: lockfile.close() os.unlink(filename) except BaseException: logging.getLogger().error("Problem removing the lock file") if log_lockfile is not None: filename = log_lockfile.name try: log_lockfile.close() os.unlink(filename) except BaseException: logging.getLogger().exception("Problem removing the log lock file")
def run(gui_config_file=None): """Main run method""" default_configuration_path = "localhost:hwr" # path to user's home dir. (works on Win2K, XP, Unix, Mac...) parser = OptionParser(usage="usage: %prog <GUI definition file> [options]") parser.add_option( "", "--logFile", action="store", type="string", help="Log file", dest="logFile", metavar="FILE", default="", ) parser.add_option( "", "--logLevel", action="store", type="string", help="Log level", dest="logLevel", default="INFO", ) parser.add_option( "", "--logTemplate", action="store", type="string", help="Log template", dest="logTemplate", default="", ) parser.add_option( "", "--bricksDirs", action="store", type="string", help="Additional directories for bricks search " + "path (you can also use the CUSTOM_BRICKS_PATH " + "environment variable)", dest="bricksDirs", metavar="dir1" + os.path.pathsep + "dir2...dirN", default="", ) parser.add_option( "", "--hardwareRepository", action="store", type="string", help="Hardware Repository Server host:port (default" + " to %s) (you can also use " % default_configuration_path + "HARDWARE_REPOSITORY_SERVER the environment variable)", metavar="HOST:PORT", dest="hardwareRepositoryServer", default="", ) parser.add_option( "", "--hardwareObjectsDirs", action="store", type="string", help="Additional directories for " + "Hardware Objects search path (you can also use " + "the CUSTOM_HARDWARE_OBJECTS_PATH environment " + "variable)", dest="hardwareObjectsDirs", metavar="dir1" + os.path.pathsep + "dir2...dirN", default="", ) parser.add_option( "-d", "", action="store_true", dest="designMode", default=False, help="start GUI in Design mode", ) parser.add_option( "-m", "", action="store_true", dest="showMaximized", default=False, help="maximize main window", ) parser.add_option( "", "--no-border", action="store_true", dest="noBorder", default=False, help="does not show borders on main window", ) parser.add_option( "", "--style", action="store", type="string", help="Visual style of the application (windows, motif," + "cde, plastique, windowsxp, or macintosh)", dest="appStyle", default=None, ) parser.add_option( "", "--userFileDir", action="store", type="string", help="User settings file stores application related settings " + "(window size and position). If not defined then user home " + "directory is used", dest="userFileDir", default=None, ) parser.add_option("", "--pyqt4", action="store_true", default=None) parser.add_option("", "--pyqt5", action="store_true", default=None) parser.add_option("", "--pyside", action="store_true", default=None) (opts, args) = parser.parse_args() logging.getLogger("HWR").info( "==============================================================================" ) logging.getLogger("HWR").info("Starting MXCuBE v%s" % str(__version__)) # get config from arguments log_file = opts.logFile log_template = opts.logTemplate hwobj_directories = opts.hardwareObjectsDirs.split(os.path.pathsep) custom_bricks_directories = opts.bricksDirs.split(os.path.pathsep) if opts.userFileDir: user_file_dir = opts.userFileDir else: user_file_dir = os.path.join(os.environ["HOME"], ".mxcube") app_style = opts.appStyle if opts.hardwareRepositoryServer: configuration_path = opts.hardwareRepositoryServer else: # try to set Hardware Repository server from environment configuration_path = os.environ.get("HARDWARE_REPOSITORY_SERVER") if configuration_path is None: configuration_path = default_configuration_path # add bricks directories and hardware objects directories from environment try: custom_bricks_directories += os.environ.get("CUSTOM_BRICKS_PATH", "").split(os.path.pathsep) except KeyError: pass try: hwobj_directories += os.environ.get("CUSTOM_HARDWARE_OBJECTS_PATH", "").split(os.path.pathsep) except KeyError: pass try: if not os.path.exists(user_file_dir): os.makedirs(user_file_dir) except BaseException: logging.getLogger().exception( "Unable to create user files directory: %s" % user_file_dir) custom_bricks_directories = [ _directory for _directory in custom_bricks_directories if _directory ] hwobj_directories = [ _directory for _directory in hwobj_directories if _directory ] main_application = QtImport.QApplication([]) if app_style: main_application.setStyle(app_style) if len(args) >= 1: if len(args) == 1: gui_config_file = os.path.abspath(args[0]) else: parser.error("Too many arguments.") sys.exit(1) if ( len( os.popen( "ps -aef | grep 'python' -i | grep 'hardwareRepository'" +\ " | grep -v 'grep' | awk '{ print $3 }'" ) .read() .strip() .split("\n") ) > 1 ): QtImport.QMessageBox.warning( None, "Warning", "Another instance of MXCuBE is running.\n", QtImport.QMessageBox.Ok, ) #sys.exit(1) # configure modules if hwobj_directories: # Must be done before init_hardware_repository HWR.addHardwareObjectsDirs(hwobj_directories) HWR.init_hardware_repository(configuration_path) HWR.setUserFileDirectory(user_file_dir) if custom_bricks_directories: gui.add_custom_bricks_dirs(custom_bricks_directories) log_lockfile = None if len(log_file) > 0: if gui_config_file: gui.set_logging_name(os.path.basename(gui_config_file), log_template) log_lock_filename = os.path.join( tempfile.gettempdir(), ".%s.lock" % os.path.basename(log_file)) log_ok = True try: log_lockfile = open(log_lock_filename, "w") except BaseException: log_ok = False else: try: os.chmod(log_lock_filename, 0o666) except BaseException: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except BaseException: log_ok = False try: log_lockfile.close() except BaseException: pass if not log_ok: index = 1 logfile_details = os.path.splitext(log_file) log_file = "" while index < 10: log_file2 = "%s.%d%s" % (logfile_details[0], index, logfile_details[1]) log_lock_filename2 = os.path.join( tempfile.gettempdir(), ".%s.lock" % os.path.basename(log_file2)) try: log_lockfile = open(log_lock_filename2, "w") except BaseException: pass else: try: os.chmod(log_lock_filename2, 0o666) except BaseException: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except BaseException: pass else: log_ok = True if log_ok: log_file = log_file2 break index += 1 gui.set_log_file(log_file) # log startup details log_level = getattr(logging, opts.logLevel) logging.getLogger().setLevel(log_level) # logging.getLogger().info("\n\n\n\n") logging.getLogger("HWR").info("Starting to load gui...") logging.getLogger("HWR").info("GUI file: %s" % (gui_config_file or "unnamed")) if len(log_file) > 0: logging.getLogger("HWR").info("Log file: %s" % log_file) logging.getLogger("HWR").info("User file directory: %s" % user_file_dir) logging.getLogger("HWR").info("System info:") logging.getLogger("HWR").info( " - Python %s on %s" % (platform.python_version(), platform.system())) logging.getLogger("HWR").info(" - Qt %s - %s %s" % ( "%d.%d.%d" % tuple(QtImport.qt_version_no), QtImport.qt_variant, "%d.%d.%d" % tuple(QtImport.pyqt_version_no), )) if QtImport.mpl_imported: logging.getLogger("HWR").info(" - Matplotlib %s" % "%d.%d.%d" % tuple(QtImport.mpl_version_no)) else: logging.getLogger("HWR").info(" - Matplotlib not available") logging.getLogger("HWR").info( "------------------------------------------------------------------------------" ) QtImport.QApplication.setDesktopSettingsAware(False) main_application.lastWindowClosed.connect(main_application.quit) supervisor = GUISupervisor.GUISupervisor( design_mode=opts.designMode, show_maximized=opts.showMaximized, no_border=opts.noBorder, ) supervisor.set_user_file_directory(user_file_dir) # post event for GUI creation main_application.postEvent( supervisor, MyCustomEvent(GUISupervisor.LOAD_GUI_EVENT, gui_config_file)) # redirect errors to logger ErrorHandler.enable_std_err_redirection() gevent_timer = QtImport.QTimer() gevent_timer.timeout.connect(do_gevent) gevent_timer.start(0) palette = main_application.palette() palette.setColor(QtImport.QPalette.ToolTipBase, QtImport.QColor(255, 241, 204)) palette.setColor(QtImport.QPalette.ToolTipText, QtImport.Qt.black) main_application.setPalette(palette) main_application.setOrganizationName("MXCuBE") main_application.setOrganizationDomain("https://github.com/mxcube") main_application.setApplicationName("MXCuBE") # app.setWindowIcon(QtImport.QIcon("images/icon.png")) main_application.exec_() supervisor.finalize() if log_lockfile is not None: filename = log_lockfile.name try: log_lockfile.close() os.unlink(filename) except BaseException: logging.getLogger().exception("Problem removing the log lock file")
app.register_error_handler(Exception, exception_handler) sess = Session() sess.init_app(app) app.debug = False # this line important for socketio msg, otherwise no msg is sent... socketio.init_app(app) # the following test prevents Flask from initializing twice # (because of the Reloader) if not app.debug or os.environ.get("WERKZEUG_RUN_MAIN") == "true": ###Initialization of the HardwareObjects # this is to allow Hardware Objects to do # 'from HardwareRepository import ...' sys.path.insert(0, os.path.dirname(__file__)) from HardwareRepository import HardwareRepository as hwr, setLogFile hwr.addHardwareObjectsDirs([os.path.join(os.path.dirname(__file__), 'HardwareObjects')]) hwr_directory = cmdline_options.hwr_directory hwr = hwr.HardwareRepository(os.path.abspath(os.path.expanduser(hwr_directory))) hwr.connect() log_file = cmdline_options.log_file if log_file: setLogFile(log_file) # installs logging handler to send messages to clients import logging_handler root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG) custom_log_handler = logging_handler.MX3LoggingHandler() custom_log_handler.setLevel(logging.DEBUG) root_logger.addHandler(custom_log_handler)
def run(GUIConfigFile=None): defaultHwrServer = 'localhost:hwr' userHomeDir = os.path.expanduser( "~") #path to user's home dir. (works on Win2K, XP, Unix, Mac...) parser = OptionParser(usage='usage: %prog <GUI definition file> [options]') parser.add_option('', '--logFile', action='store', type='string', help='Log file', dest='logFile', metavar='FILE', default='') parser.add_option('', '--logLevel', action='store', type='string', help='Log level', dest='logLevel', default='INFO') parser.add_option( '', '--bricksDirs', action='store', type='string', help= 'Additional directories for bricks search path (you can also use the CUSTOM_BRICKS_PATH environment variable)', dest='bricksDirs', metavar='dir1' + os.path.pathsep + 'dir2...dirN', default='') parser.add_option( '', '--hardwareRepository', action='store', type='string', help= 'Hardware Repository Server host:port (default to %s) (you can also use HARDWARE_REPOSITORY_SERVER the environment variable)' % defaultHwrServer, metavar='HOST:PORT', dest='hardwareRepositoryServer', default='') parser.add_option( '', '--hardwareObjectsDirs', action='store', type='string', help= 'Additional directories for Hardware Objects search path (you can also use the CUSTOM_HARDWARE_OBJECTS_PATH environment variable)', dest='hardwareObjectsDirs', metavar='dir1' + os.path.pathsep + 'dir2...dirN', default='') parser.add_option('-d', '', action='store_true', dest="designMode", default=False, help="start GUI in Design mode") parser.add_option('-m', '', action='store_true', dest="showMaximized", default=False, help="maximize main window") parser.add_option('', '--no-border', action='store_true', dest='noBorder', default=False, help="does not show borders on main window") parser.add_option( '-w', '--web-server-port', action='store', type="int", dest='webServerPort', default=0, help="port number for the remote interpreter web application server") #parser.add_option('', '--widgetcount', action='store_true', dest='widgetCount', default=False, help="prints debug message at the end about number of widgets left undestroyed") (opts, args) = parser.parse_args() if len(args) >= 1: if len(args) == 1: GUIConfigFile = os.path.abspath(args[0]) else: parser.error('Too many arguments.') sys.exit(1) if opts.webServerPort: interpreter = terminal_server.InteractiveInterpreter() terminal_server.set_interpreter(interpreter) gevent.spawn(terminal_server.serve_forever, opts.webServerPort) # # get config from arguments # logFile = opts.logFile hoDirs = opts.hardwareObjectsDirs.split(os.path.pathsep) bricksDirs = opts.bricksDirs.split(os.path.pathsep) if opts.hardwareRepositoryServer: hwrServer = opts.hardwareRepositoryServer else: # # try to set Hardware Repository server from environment # try: hwrServer = os.environ['HARDWARE_REPOSITORY_SERVER'] except KeyError: hwrServer = defaultHwrServer # # add bricks directories and hardware objects directories from environment # try: bricksDirs += os.environ['CUSTOM_BRICKS_PATH'].split(os.path.pathsep) except KeyError: pass try: hoDirs += os.environ['CUSTOM_HARDWARE_OBJECTS_PATH'].split( os.path.pathsep) except KeyError: pass bricksDirs = [_f for _f in bricksDirs if _f] hoDirs = [_f for _f in hoDirs if _f] app = QApplication([]) lockfile = None if not opts.designMode and GUIConfigFile: lock_filename = os.path.join( tempfile.gettempdir(), '.%s.lock' % os.path.basename(GUIConfigFile or "unnamed")) try: lockfile = open(lock_filename, "w") except: logging.getLogger().exception( "Cannot create lock file (%s), exiting" % lock_filename) sys.exit(1) else: os.chmod(lock_filename, 0o666) try: fcntl.lockf(lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: logging.getLogger().exception( "Cannot acquire lock (%s), exiting (hint: maybe the same application is already running ?)" % lock_filename) sys.exit(1) # # configure modules # HardwareRepository.setHardwareRepositoryServer(hwrServer) HardwareRepository.addHardwareObjectsDirs(hoDirs) BlissFramework.addCustomBricksDirs(bricksDirs) # # set log name and log file # if GUIConfigFile: BlissFramework.setLoggingName(os.path.basename(GUIConfigFile)) log_lockfile = None if len(logFile) > 0: log_lock_filename = os.path.join( tempfile.gettempdir(), '.%s.lock' % os.path.basename(logFile)) log_ok = True try: log_lockfile = open(log_lock_filename, "w") except: log_ok = False else: try: os.chmod(log_lock_filename, 0o666) except: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: log_ok = False try: log_lockfile.close() except: pass if not log_ok: i = 1 logfile_details = os.path.splitext(logFile) logFile = "" while i < 10: logFile2 = "%s.%d%s" % (logfile_details[0], i, logfile_details[1]) log_lock_filename2 = os.path.join( tempfile.gettempdir(), '.%s.lock' % os.path.basename(logFile2)) try: log_lockfile = open(log_lock_filename2, "w") except: pass else: try: os.chmod(log_lock_filename2, 0o666) except: pass try: fcntl.lockf(log_lockfile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) except: pass else: log_ok = True if log_ok: logFile = logFile2 break i += 1 if len(logFile) > 0: BlissFramework.setLogFile(logFile) # # log startup details # logLevel = getattr(logging, opts.logLevel) logging.getLogger().setLevel(logLevel) logInfo = 'GUI started (%s)' % (GUIConfigFile or "unnamed") logInfo += ', HWRSERVER=%s' % hwrServer if len(hoDirs) > 0: logInfo += ', HODIRS=%s' % os.path.pathsep.join(hoDirs) if len(bricksDirs) > 0: logInfo += ', BRICKSDIRS=%s' % os.path.pathsep.join(bricksDirs) logging.getLogger().info(logInfo) QApplication.setDesktopSettingsAware(False) #use default settings QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()")) supervisor = GUISupervisor.GUISupervisor(designMode=opts.designMode, showMaximized=opts.showMaximized, noBorder=opts.noBorder) #BlissFramework.setDebugMode(True) # # post event for GUI creation # app.postEvent(supervisor, QCustomEvent(GUISupervisor.LOAD_GUI_EVENT, GUIConfigFile)) # # redirect errors to logger # ErrorHandler.enableStdErrRedirection() timer = QTimer() timer.connect(timer, SIGNAL("timeout()"), do_gevent) timer.start(0) app.exec_loop() """ def process_qt_events(): while True: time.sleep(0.01) while app.hasPendingEvents(): app.processEvents() time.sleep(0.01) if not app.mainWidget() or not app.mainWidget().isVisible(): return qt_events = gevent.spawn(process_qt_events) qt_events.join() """ supervisor.finalize() if lockfile is not None: filename = lockfile.name try: lockfile.close() os.unlink(filename) except: logging.getLogger().error("Problem removing the lock file") if log_lockfile is not None: filename = log_lockfile.name try: log_lockfile.close() os.unlink(filename) except: logging.getLogger().exception("Problem removing the log lock file")
def getStdHardwareObjectsPath(): import HardwareObjects # first looks in containing package return os.path.dirname(HardwareObjects.__file__) sys.path.insert(0, getStdHardwareObjectsPath()) hwobj_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "HardwareObjects") hwobj_dir_list = [hwobj_dir] for subdir in ("sample_changer", "mockup"): hwobj_dir_list.append(os.path.join(hwobj_dir, subdir)) HardwareRepository.addHardwareObjectsDirs(hwobj_dir_list) # # create the HardwareRepository logger # _hwr_logger = logging.getLogger("HWR") _hwr_logger.setLevel(logging.DEBUG) _oldLevel = logging.DEBUG _hwr_formatter = logging.Formatter("%(asctime)s |%(levelname)-7s| %(message)s") if len(logging.root.handlers) == 0: # # log to stdout # _hdlr = logging.StreamHandler(sys.stdout) _hdlr.setFormatter(_hwr_formatter)