예제 #1
0
파일: data.py 프로젝트: ryuvsken/translator
import os
import sys

import click
from elasticsearch import Elasticsearch
from logbook import Logger, StreamHandler
import sqlalchemy

from app import config
from app.analysis.model import db, Phrase, Sentence

es_host = os.environ.get('ES_HOST', 'localhost')
es_port = int(os.environ.get('ES_PORT', 9200))
es = Elasticsearch([{'host': es_host, 'port': es_port}])

StreamHandler(sys.stderr, level='INFO').push_application()
log = Logger('')


def str2datetime(s):
    """Parse a datetime string (with milliseconds)."""
    parts = s.split('.')
    dt = datetime.strptime(parts[0], "%Y-%m-%d %H:%M:%S")
    return dt.replace(microsecond=int(parts[1]))


def unix_time(dt):
    epoch = datetime.utcfromtimestamp(0)
    delta = dt - epoch
    return delta.total_seconds()
예제 #2
0
    def __init__(self, **kwargs):
        """
        Keyword Args:

            filename=None (str, list):                      csv data file.
            **datafeed_args (any):                          any datafeed-related args, passed through to
                                                            default btgym.datafeed class.
            dataset=None (btgym.datafeed):                  BTgymDataDomain instance,
                                                            overrides `filename` or any other datafeed-related args.
            strategy=None (btgym.startegy):                 strategy to be used by `engine`, any subclass of
                                                            btgym.strategy.base.BTgymBaseStrateg
            engine=None (bt.Cerebro):                       environment simulation engine, any bt.Cerebro subclass,
                                                            overrides `strategy` arg.
            network_address=`tcp://127.0.0.1:` (str):       BTGym_server address.
            port=5500 (int):                                network port to use for server - API_shell communication.
            data_master=True (bool):                        let this environment control over data_server;
            data_network_address=`tcp://127.0.0.1:` (str):  data_server address.
            data_port=4999 (int):                           network port to use for server -- data_server communication.
            connect_timeout=60 (int):                       server connection timeout in seconds.
            render_enabled=True (bool):                     enable rendering for this environment;
            render_modes=['human', 'episode'] (list):       `episode` - plotted episode results;
                                                            `human` - raw_state observation.
            **render_args (any):                            any render-related args, passed through to renderer class.
            verbose=0 (int):                                verbosity mode, {0 - WARNING, 1 - INFO, 2 - DEBUG}
            log_level=None (int):                           logbook level {DEBUG=10, INFO=11, NOTICE=12, WARNING=13},
                                                            overrides `verbose` arg;
            log=None (logbook.Logger):                      external logbook logger,
                                                            overrides `log_level` and `verbose` args.
            task=0 (int):                                   environment id

        Environment kwargs applying logic::

            if <engine> kwarg is given:
                do not use default engine and strategy parameters;
                ignore <strategy> kwarg and all strategy and engine-related kwargs.

            else (no <engine>):
                use default engine parameters;
                if any engine-related kwarg is given:
                    override corresponding default parameter;

                if <strategy> is given:
                    do not use default strategy parameters;
                    if any strategy related kwarg is given:
                        override corresponding strategy parameter;

                else (no <strategy>):
                    use default strategy parameters;
                    if any strategy related kwarg is given:
                        override corresponding strategy parameter;

            if <dataset> kwarg is given:
                do not use default dataset parameters;
                ignore dataset related kwargs;

            else (no <dataset>):
                use default dataset parameters;
                    if  any dataset related kwarg is given:
                        override corresponding dataset parameter;

            If any <other> kwarg is given:
                override corresponding default parameter.
        """
        # Parameters and default values:
        self.params = dict(

            # Backtrader engine mandatory parameters:
            engine=dict(
                start_cash=10.0,  # initial trading capital.
                broker_commission=
                0.001,  # trade execution commission, default is 0.1% of operation value.
                fixed_stake=10,  # single trade stake is fixed type by def.
            ),
            # Dataset mandatory parameters:
            dataset=dict(filename=None, ),
            strategy=dict(state_shape=dict(), ),
            render=dict(),
        )
        p2 = dict(  # IS HERE FOR REFERENCE ONLY
            # Strategy related parameters:
            # Observation state shape is dictionary of Gym spaces,
            # at least should contain `raw_state` field.
            # By convention first dimension of every Gym Box space is time embedding one;
            # one can define any shape; should match env.observation_space.shape.
            # observation space state min/max values,
            # For `raw_state' - absolute min/max values from BTgymDataset will be used.
            state_shape=dict(raw_state=spaces.Box(
                shape=(10, 4), low=-100, high=100, dtype=np.float32)),
            drawdown_call=
            None,  # episode maximum drawdown threshold, default is 90% of initial value.
            portfolio_actions=None,
            # agent actions,
            # should consist with BTgymStrategy order execution logic;
            # defaults are: 0 - 'do nothing', 1 - 'buy', 2 - 'sell', 3 - 'close position'.
            skip_frame=None,
            # Number of environment steps to skip before returning next response,
            # e.g. if set to 10 -- agent will interact with environment every 10th episode step;
            # Every other step agent's action is assumed to be 'hold'.
            # Note: INFO part of environment response is a list of all skipped frame's info's,
            #       i.e. [info[-9], info[-8], ..., info[0].
        )
        # Update self attributes, remove used kwargs:
        for key in dir(self):
            if key in kwargs.keys():
                setattr(self, key, kwargs.pop(key))

        self.metadata = {'render.modes': self.render_modes}

        # Logging and verbosity control:
        if self.log is None:
            StreamHandler(sys.stdout).push_application()
            if self.log_level is None:
                log_levels = [(0, NOTICE), (1, INFO), (2, DEBUG)]
                self.log_level = WARNING
                for key, value in log_levels:
                    if key == self.verbose:
                        self.log_level = value
            self.log = Logger('BTgymAPIshell_{}'.format(self.task),
                              level=self.log_level)

        # Network parameters:
        self.network_address += str(self.port)
        self.data_network_address += str(self.data_port)

        # Set server rendering:
        if self.render_enabled:
            self.renderer = BTgymRendering(self.metadata['render.modes'],
                                           log_level=self.log_level,
                                           **kwargs)

        else:
            self.renderer = BTgymNullRendering()
            self.log.info(
                'Rendering disabled. Call to render() will return null-plug image.'
            )

        # Append logging:
        self.renderer.log = self.log

        # Update params -1: pull from renderer, remove used kwargs:
        self.params['render'].update(self.renderer.params)
        for key in self.params['render'].keys():
            if key in kwargs.keys():
                _ = kwargs.pop(key)

        if self.data_master:
            # DATASET preparation, only data_master executes this:
            #
            if self.dataset is not None:
                # If BTgymDataset instance has been passed:
                # do nothing.
                msg = 'Custom Dataset class used.'

            else:
                # If no BTgymDataset has been passed,
                # Make default dataset with given CSV file:
                try:
                    os.path.isfile(str(self.params['dataset']['filename']))

                except:
                    raise FileNotFoundError(
                        'Dataset source data file not specified/not found')

                # Use kwargs to instantiate dataset:
                self.dataset = BTgymDataset(**kwargs)
                msg = 'Base Dataset class used.'

            # Append logging:
            self.dataset.set_logger(self.log_level, self.task)

            # Update params -2: pull from dataset, remove used kwargs:
            self.params['dataset'].update(self.dataset.params)
            for key in self.params['dataset'].keys():
                if key in kwargs.keys():
                    _ = kwargs.pop(key)

            self.log.info(msg)

        # Connect/Start data server (and get dataset statistic):
        self.log.info('Connecting data_server...')
        self._start_data_server()
        self.log.info('...done.')
        # ENGINE preparation:

        # Update params -3: pull engine-related kwargs, remove used:
        for key in self.params['engine'].keys():
            if key in kwargs.keys():
                self.params['engine'][key] = kwargs.pop(key)

        if self.engine is not None:
            # If full-blown bt.Cerebro() subclass has been passed:
            # Update info:
            msg = 'Custom Cerebro class used.'
            self.strategy = msg
            for key in self.params['engine'].keys():
                self.params['engine'][key] = msg

        # Note: either way, bt.observers.DrawDown observer [and logger] will be added to any BTgymStrategy instance
        # by BTgymServer process at runtime.

        else:
            # Default configuration for Backtrader computational engine (Cerebro),
            # if no bt.Cerebro() custom subclass has been passed,
            # get base class Cerebro(), using kwargs on top of defaults:
            self.engine = bt.Cerebro()
            msg = 'Base Cerebro class used.'

            # First, set STRATEGY configuration:
            if self.strategy is not None:
                # If custom strategy has been passed:
                msg2 = 'Custom Strategy class used.'

            else:
                # Base class strategy :
                self.strategy = BTgymBaseStrategy
                msg2 = 'Base Strategy class used.'

            # Add, using kwargs on top of defaults:
            #self.log.debug('kwargs for strategy: {}'.format(kwargs))
            strat_idx = self.engine.addstrategy(self.strategy, **kwargs)

            msg += ' ' + msg2

            # Second, set Cerebro-level configuration:
            self.engine.broker.setcash(self.params['engine']['start_cash'])
            self.engine.broker.setcommission(
                self.params['engine']['broker_commission'])
            self.engine.addsizer(bt.sizers.SizerFix,
                                 stake=self.params['engine']['fixed_stake'])

        self.log.info(msg)

        # Define observation space shape, minimum / maximum values and agent action space.
        # Retrieve values from configured engine or...

        # ...Update params -4:
        # Pull strategy defaults to environment params dict :
        for t_key, t_value in self.engine.strats[0][0][0].params._gettuple():
            self.params['strategy'][t_key] = t_value

        # Update it with values from strategy 'passed-to params':
        for key, value in self.engine.strats[0][0][2].items():
            self.params['strategy'][key] = value

        # ... Push it all back (don't ask):
        for key, value in self.params['strategy'].items():
            self.engine.strats[0][0][2][key] = value

        # For 'raw_state' min/max values,
        # the only way is to infer from raw Dataset price values (we already got those from data_server):
        if 'raw_state' in self.params['strategy']['state_shape'].keys():
            # Exclude 'volume' from columns we count:
            self.dataset_columns.remove('volume')

            #print(self.params['strategy'])
            #print('self.engine.strats[0][0][2]:', self.engine.strats[0][0][2])
            #print('self.engine.strats[0][0][0].params:', self.engine.strats[0][0][0].params._gettuple())

            # Override with absolute price min and max values:
            self.params['strategy']['state_shape']['raw_state'].low =\
                self.engine.strats[0][0][2]['state_shape']['raw_state'].low =\
                np.zeros(self.params['strategy']['state_shape']['raw_state'].shape) +\
                self.dataset_stat.loc['min', self.dataset_columns].min()

            self.params['strategy']['state_shape']['raw_state'].high = \
                self.engine.strats[0][0][2]['state_shape']['raw_state'].high = \
                np.zeros(self.params['strategy']['state_shape']['raw_state'].shape) + \
                self.dataset_stat.loc['max', self.dataset_columns].max()

            self.log.info(
                'Inferring `state_raw` high/low values form dataset: {:.6f} / {:.6f}.'
                .format(
                    self.dataset_stat.loc['min', self.dataset_columns].min(),
                    self.dataset_stat.loc['max', self.dataset_columns].max()))

        # Set observation space shape from engine/strategy parameters:
        self.observation_space = DictSpace(
            self.params['strategy']['state_shape'])

        self.log.debug('Obs. shape: {}'.format(self.observation_space.spaces))
        #self.log.debug('Obs. min:\n{}\nmax:\n{}'.format(self.observation_space.low, self.observation_space.high))

        # Set action space and corresponding server messages:
        self.action_space = spaces.Discrete(
            len(self.params['strategy']['portfolio_actions']))
        self.server_actions = self.params['strategy']['portfolio_actions']

        # Finally:
        self.server_response = None
        self.env_response = None

        #if not self.data_master:
        self._start_server()
        self.closed = False

        self.log.info('Environment is ready.')
예제 #3
0
    def __init__(
            self,
            filename=None,
            parsing_params=None,
            sampling_params=None,
            name='base_data',
            data_names=('default_asset',),
            task=0,
            frozen_time_split=None,
            log_level=WARNING,
            _config_stack=None,
            **kwargs
    ):
        """
        Args:

            filename:                       Str or list of str, should be given either here or when calling read_csv(),
                                            see `Notes`.

            specific_params CSV to Pandas parsing

            sep:                            ';'
            header:                         0
            index_col:                      0
            parse_dates:                    True
            names:                          ['open', 'high', 'low', 'close', 'volume']

            specific_params Pandas to BT.feeds conversion

            timeframe=1:                    1 minute.
            datetime:                       0
            open:                           1
            high:                           2
            low:                            3
            close:                          4
            volume:                         -1
            openinterest:                   -1

            specific_params Sampling

            sample_class_ref:               None - if not None, than sample() method will return instance of specified
                                            class, which itself must be subclass of BaseBTgymDataset,
                                            else returns instance of the base data class.

            start_weekdays:                 [0, 1, 2, 3, ] - Only weekdays from the list will be used for sample start.
            start_00:                       True - sample start time will be set to first record of the day
                                            (usually 00:00).
            sample_duration:                {'days': 1, 'hours': 23, 'minutes': 55} - Maximum sample time duration
                                            in days, hours, minutes
            time_gap:                       {''days': 0, hours': 5, 'minutes': 0} - Data omittance threshold:
                                            maximum no-data time gap allowed within sample in days, hours.
                                            Thereby, if set to be < 1 day, samples containing weekends and holidays gaps
                                            will be rejected.
            test_period:                    {'days': 0, 'hours': 0, 'minutes': 0} - setting this param to non-zero
                                            duration forces instance.data split to train / test subsets with test
                                            subset duration equal to `test_period` with `time_gap` tolerance. Train data
                                            always precedes test one:
                                            [0_record<-train_data->split_point_record<-test_data->last_record].
            sample_expanding:               None, reserved for child classes.

        Note:
            - CSV file can contain duplicate records, checks will be performed and all duplicates will be removed;

            - CSV file should be properly sorted by date_time in ascending order, no sorting checks performed.

            - When supplying list of file_names, all files should be also listed ascending by their time period,
              no correct sampling will be possible otherwise.

            - Default parameters are source-specific and made to correctly parse 1 minute Forex generic ASCII
              data files from www.HistData.com. Tune according to your data source.
        """
        self.filename = filename

        if parsing_params is None:
            self.parsing_params = dict(
                # Default parameters for source-specific CSV datafeed class,
                # correctly parses 1 minute Forex generic ASCII
                # data files from www.HistData.com:

                # CSV to Pandas params.
                sep=';',
                header=0,
                index_col=0,
                parse_dates=True,
                names=['open', 'high', 'low', 'close', 'volume'],

                # Pandas to BT.feeds params:
                timeframe=1,  # 1 minute.
                datetime=0,
                open=1,
                high=2,
                low=3,
                close=4,
                volume=-1,
                openinterest=-1,
            )
        else:
            self.parsing_params = parsing_params

        if sampling_params is None:
            self.sampling_params = dict(
                # Sampling params:
                start_weekdays=[],  # Only weekdays from the list will be used for episode start.
                start_00=False,  # Sample start time will be set to first record of the day (usually 00:00).
                sample_duration=dict(  # Maximum sample time duration in days, hours, minutes:
                    days=0,
                    hours=0,
                    minutes=0
                ),
                time_gap=dict(  # Maximum data time gap allowed within sample in days, hours. Thereby,
                    days=0,  # if set to be < 1 day, samples containing weekends and holidays gaps will be rejected.
                    hours=0,
                ),
                test_period=dict(  # Time period to take test samples from, in days, hours, minutes:
                    days=0,
                    hours=0,
                    minutes=0
                ),
                expanding=False,
            )
        else:
            self.sampling_params = sampling_params

        self.name = name
        # String will be used as key name for bt_feed data-line:

        self.task = task
        self.log_level = log_level
        self.data_names = data_names
        self.data_name = self.data_names[0]

        self.data = None  # Will hold actual data as pandas dataframe
        self.is_ready = False

        self.global_timestamp = 0
        self.start_timestamp = 0
        self.final_timestamp = 0

        self.data_stat = None  # Dataset descriptive statistic as pandas dataframe
        self.data_range_delta = None  # Dataset total duration timedelta
        self.max_time_gap = None
        self.time_gap = None
        self.max_sample_len_delta = None
        self.sample_duration = None
        self.sample_num_records = 0
        self.start_weekdays = {0, 1, 2, 3, 4, 5, 6}
        self.start_00 = False
        self.expanding = False

        self.sample_instance = None

        self.test_range_delta = None
        self.train_range_delta = None
        self.test_num_records = 0
        self.train_num_records = 0
        self.total_num_records = 0
        self.train_interval = [0, 0]
        self.test_interval = [0, 0]
        self.test_period = {'days': 0, 'hours': 0, 'minutes': 0}
        self.train_period = {'days': 0, 'hours': 0, 'minutes': 0}
        self._test_period_backshift_delta = datetime.timedelta(**{'days': 0, 'hours': 0, 'minutes': 0})
        self.sample_num = 0
        self.task = 0
        self.metadata = {'sample_num': 0, 'type': None}

        self.set_params(self.parsing_params)
        self.set_params(self.sampling_params)

        self._config_stack = copy.deepcopy(_config_stack)
        try:
            nested_config = self._config_stack.pop()

        except (IndexError, AttributeError) as e:
            # IF stack is empty, sample of this instance itself is not supposed to be sampled.
            nested_config = dict(
                class_ref=None,
                kwargs=dict(
                    parsing_params=self.parsing_params,
                    sample_params=None,
                    name='data_stream',
                    task=self.task,
                    log_level=self.log_level,
                    _config_stack=None,
                )
            )
        # Configure sample instance parameters:
        self.nested_class_ref = nested_config['class_ref']
        self.nested_params = nested_config['kwargs']
        self.sample_name = '{}_w_{}_'.format(self.nested_params['name'], self.task)
        self.nested_params['_config_stack'] = self._config_stack

        # Logging:
        StreamHandler(sys.stdout).push_application()
        self.log = Logger('{}_{}'.format(self.name, self.task), level=self.log_level)

        # Legacy parameter dictionary, left here for BTgym API_shell:
        self.params = {}
        self.params.update(self.parsing_params)
        self.params.update(self.sampling_params)

        if frozen_time_split is not None:
            self.frozen_time_split = datetime.datetime(**frozen_time_split)

        else:
            self.frozen_time_split = None

        self.frozen_split_timestamp = None
예제 #4
0
import asyncio
import configparser
import inspect
import sys
import time
import os

import discord
from discord.ext import commands
from logbook import Logger, StreamHandler, FileHandler

logger = Logger("Discord Music")
logger.handlers.append(StreamHandler(sys.stdout, bubble=True))
logger.handlers.append(FileHandler("last-run.log", bubble=True, mode="w"))

logger.debug("Loading config files")

default_config = "[Config]\ntoken = \nsnip = "

config = configparser.ConfigParser()

token = ""
snip = ""

if os.path.exists("config.ini"):
    config.read("config.ini")

    try:
        token = config['Config']['token']
    except KeyError:
        logger.critical(
예제 #5
0
def main():
    from logbook import StreamHandler
    import sys
    StreamHandler(sys.stdout).push_application()
예제 #6
0
"""
Module for building a complete dataset from local directory with csv files.
"""
import os
import sys

from logbook import Logger, StreamHandler
from numpy import empty
from pandas import DataFrame, read_csv, Index, Timedelta, NaT
from trading_calendars import register_calendar_alias

from zipline.utils.cli import maybe_show_progress

from . import core as bundles

handler = StreamHandler(sys.stdout, format_string=" | {record.message}")
logger = Logger(__name__)
logger.handlers.append(handler)


def csvdir_equities(tframes=None, csvdir=None):
    """
    Generate an ingest function for custom data bundle
    This function can be used in ~/.zipline/extension.py
    to register bundle with custom parameters, e.g. with
    a custom trading calendar.

    Parameters
    ----------
    tframes: tuple, optional
        The data time frames, supported timeframes: 'daily' and 'minute'
예제 #7
0
파일: config.py 프로젝트: spraggy0558/Pyfa
def defLogging():
    global debug
    global logPath
    global loggingLevel
    global logging_setup

    try:
        if debug:
            logging_setup = NestedSetup([
                # make sure we never bubble up to the stderr handler
                # if we run out of setup handling
                NullHandler(),
                StreamHandler(sys.stdout, bubble=False, level=loggingLevel),
                TimedRotatingFileHandler(
                    logPath,
                    level=0,
                    backup_count=3,
                    bubble=True,
                    date_format='%Y-%m-%d',
                ),
            ])
        else:
            logging_setup = NestedSetup([
                # make sure we never bubble up to the stderr handler
                # if we run out of setup handling
                NullHandler(),
                FingersCrossedHandler(
                    TimedRotatingFileHandler(
                        logPath,
                        level=0,
                        backup_count=3,
                        bubble=False,
                        date_format='%Y-%m-%d',
                    ),
                    action_level=ERROR,
                    buffer_size=1000,
                    # pull_information=True,
                    # reset=False,
                )
            ])
    except:
        print(
            "Critical error attempting to setup logging. Falling back to console only."
        )
        logging_setup = NestedSetup([
            # make sure we never bubble up to the stderr handler
            # if we run out of setup handling
            NullHandler(),
            StreamHandler(sys.stdout, bubble=False)
        ])

    with logging_setup.threadbound():

        # Output all stdout (print) messages as warnings
        try:
            sys.stdout = LoggerWriter(pyfalog.warning)
        except:
            pyfalog.critical(
                "Cannot redirect.  Continuing without writing stdout to log.")

        # Output all stderr (stacktrace) messages as critical
        try:
            sys.stderr = LoggerWriter(pyfalog.critical)
        except:
            pyfalog.critical(
                "Cannot redirect.  Continuing without writing stderr to log.")
예제 #8
0
    def run(self):
        """
        Server process runtime body. This method is invoked by env._start_server().
        """
        # Logging:
        from logbook import Logger, StreamHandler, WARNING
        import sys
        StreamHandler(sys.stdout).push_application()
        if self.log_level is None:
            self.log_level = WARNING
        self.log = Logger('BTgymServer_{}'.format(self.task),
                          level=self.log_level)

        self.process = multiprocessing.current_process()
        self.log.info('PID: {}'.format(self.process.pid))

        # Runtime Housekeeping:
        cerebro = None
        episode_result = dict()
        episode_sample = None
        trial_sample = None
        trial_stat = None
        dataset_stat = None

        # How long to wait for data_master to reset data:
        self.wait_for_data_reset = 300  # seconds

        connect_timeout = 60  # in seconds

        # Set up a comm. channel for server as ZMQ socket
        # to carry both service and data signal
        # !! Reminder: Since we use REQ/REP - messages do go in pairs !!
        self.context = zmq.Context()
        self.socket = self.context.socket(zmq.REP)
        self.socket.setsockopt(zmq.RCVTIMEO, -1)
        self.socket.setsockopt(zmq.SNDTIMEO, connect_timeout * 1000)
        self.socket.bind(self.network_address)

        self.data_context = zmq.Context()
        self.data_socket = self.data_context.socket(zmq.REQ)
        self.data_socket.setsockopt(zmq.RCVTIMEO, connect_timeout * 1000)
        self.data_socket.setsockopt(zmq.SNDTIMEO, connect_timeout * 1000)
        self.data_socket.connect(self.data_network_address)

        # Check connection:
        self.log.debug('Pinging data_server at: {} ...'.format(
            self.data_network_address))

        data_server_response = self._comm_with_timeout(
            socket=self.data_socket, message={'ctrl': 'ping!'})
        if data_server_response['status'] in 'ok':
            self.log.debug(
                'Data_server seems ready with response: <{}>'.format(
                    data_server_response['message']))

        else:
            msg = 'Data_server unreachable with status: <{}>.'.\
                format(data_server_response['status'])
            self.log.error(msg)
            raise ConnectionError(msg)

        # Init renderer:
        self.render.initialize_pyplot()

        # Mandatory DrawDown and auxillary plotting observers to add to data-master startegy instance:
        # TODO: make plotters optional args
        if self.render.enabled:
            aux_obsrevers = [bt.observers.DrawDown, NormPnL, Position, Reward]

        else:
            aux_obsrevers = [bt.observers.DrawDown]

        # Server 'Control Mode' loop:
        for episode_number in itertools.count(0):
            while True:
                # Stuck here until '_reset' or '_stop':
                service_input = self.socket.recv_pyobj()
                msg = 'Control mode: received <{}>'.format(service_input)
                self.log.debug(msg)

                if 'ctrl' in service_input:
                    # It's time to exit:
                    if service_input['ctrl'] == '_stop':
                        # Server shutdown logic:
                        # send last run statistic, release comm channel and exit:
                        message = 'Exiting.'
                        self.log.info(message)
                        self.socket.send_pyobj(message)
                        self.socket.close()
                        self.context.destroy()
                        return None

                    # Start episode:
                    elif service_input['ctrl'] == '_reset':
                        message = 'Preparing new episode with kwargs: {}'.format(
                            service_input['kwargs'])
                        self.log.debug(message)
                        self.socket.send_pyobj(message)  # pairs '_reset'
                        break

                    # Retrieve statistic:
                    elif service_input['ctrl'] == '_getstat':
                        self.socket.send_pyobj(episode_result)
                        self.log.debug('Episode statistic sent.')

                    # Send episode rendering:
                    elif service_input[
                            'ctrl'] == '_render' and 'mode' in service_input.keys(
                            ):
                        # Just send what we got:
                        self.socket.send_pyobj(
                            self.render.render(service_input['mode'], ))
                        self.log.debug(
                            'Episode rendering for [{}] sent.'.format(
                                service_input['mode']))

                    else:  # ignore any other input
                        # NOTE: response string must include 'ctrl' key
                        # for env.reset(), env.get_stat(), env.close() correct operation.
                        message = {
                            'ctrl':
                            'send control keys: <_reset>, <_getstat>, <_render>, <_stop>.'
                        }
                        self.log.debug('Control mode: sent: ' + str(message))
                        self.socket.send_pyobj(
                            message)  # pairs any other input

                else:
                    message = 'No <ctrl> key received:{}\nHint: forgot to call reset()?'.format(
                        msg)
                    self.log.debug(message)
                    self.socket.send_pyobj(message)

            # Got '_reset' signal -> prepare Cerebro subclass and run episode:
            start_time = time.time()
            cerebro = copy.deepcopy(self.cerebro)
            cerebro._socket = self.socket
            cerebro._log = self.log
            cerebro._render = self.render

            # Add auxillary observers, if not already:
            for aux in aux_obsrevers:
                is_added = False
                for observer in cerebro.observers:
                    if aux in observer:
                        is_added = True
                if not is_added:
                    cerebro.addobserver(aux)

            # Add communication utility:
            cerebro.addanalyzer(
                _BTgymAnalyzer,
                _name='_env_analyzer',
            )

            # Data preparation:
            # Parse args we got with _reset call:
            sample_config = dict(
                episode_config=copy.deepcopy(DataSampleConfig),
                trial_config=copy.deepcopy(DataSampleConfig))
            for key, config in sample_config.items():
                try:
                    config.update(service_input['kwargs'][key])

                except KeyError:
                    self.log.debug(
                        '_reset <{}> kwarg not found, using default values: {}'
                        .format(key, config))

            # Get new Trial from data_server if requested,
            # despite bult-in new/reuse data object sampling option, perform checks here to avoid
            # redundant traffic:
            if sample_config['trial_config']['get_new'] or trial_sample is None:
                self.log.debug(
                    'Requesting new Trial sample with args: {}'.format(
                        sample_config['trial_config']))
                trial_sample, trial_stat, dataset_stat = self.get_data(
                    **sample_config['trial_config'])
                trial_sample.set_logger(self.log_level, self.task)
                self.log.debug('Got new Trial: <{}>'.format(
                    trial_sample.filename))

            else:
                self.log.debug('Reusing Trial <{}>'.format(
                    trial_sample.filename))

            # Get episode:
            self.log.debug('Requesting episode from <{}>'.format(
                trial_sample.filename))
            episode_sample = trial_sample.sample(
                **sample_config['episode_config'])

            # Get episode data statistic and pass it to strategy params:
            cerebro.strats[0][0][2]['trial_stat'] = trial_stat
            cerebro.strats[0][0][2]['trial_metadata'] = trial_sample.metadata
            cerebro.strats[0][0][2]['dataset_stat'] = dataset_stat
            cerebro.strats[0][0][2]['episode_stat'] = episode_sample.describe()
            cerebro.strats[0][0][2]['metadata'] = episode_sample.metadata

            # Set nice broker cash plotting:
            cerebro.broker.set_shortcash(False)

            # Convert and add data to engine:
            cerebro.adddata(episode_sample.to_btfeed())

            # Finally:
            episode = cerebro.run(stdstats=True,
                                  preload=False,
                                  oldbuysell=True)[0]

            # Update episode rendering:
            _ = self.render.render('just_render', cerebro=cerebro)
            _ = None

            # Recover that bloody analytics:
            analyzers_list = episode.analyzers.getnames()
            analyzers_list.remove('_env_analyzer')

            elapsed_time = timedelta(seconds=time.time() - start_time)
            self.log.debug('Episode elapsed time: {}.'.format(elapsed_time))

            episode_result['episode'] = episode_number
            episode_result['runtime'] = elapsed_time
            episode_result['length'] = len(episode.data.close)

            for name in analyzers_list:
                episode_result[name] = episode.analyzers.getbyname(
                    name).get_analysis()

            gc.collect()

        # Just in case -- we actually shouldn't get there except by some error:
        return None
예제 #9
0
    def __init__(self, filament, **kwargs):

        self._start = datetime.now()
        try:
            log_path = os.path.join(os.path.expanduser('~'), '.fibratus', 'fibratus.log')
            FileHandler(log_path, mode='w+').push_application()
            StreamHandler(sys.stdout).push_application()
        except PermissionError:
            panic("ERROR - Unable to open log file for writing due to permission error")

        self.logger = Logger(Fibratus.__name__)

        self._config = YamlConfig()

        self.logger.info('Starting...')

        enable_cswitch = kwargs.pop('cswitch', False)

        self.kcontroller = KTraceController()
        self.ktrace_props = KTraceProps()
        self.ktrace_props.enable_kflags(cswitch=enable_cswitch)
        self.ktrace_props.logger_name = etw.KERNEL_LOGGER_NAME

        enum_handles = kwargs.pop('enum_handles', True)

        self.handle_repository = HandleRepository()
        self._handles = []
        # query for handles on the
        # start of the kernel trace
        if enum_handles:
            self.logger.info('Enumerating system handles...')
            self._handles = self.handle_repository.query_handles()
            self.logger.info('%s handles found' % len(self._handles))
            self.handle_repository.free_buffers()
        self.thread_registry = ThreadRegistry(self.handle_repository, self._handles)

        self.kevt_streamc = KEventStreamCollector(etw.KERNEL_LOGGER_NAME.encode())
        image_skips = self._config.image_skips
        if len(image_skips) > 0:
            self.logger.info("Adding skips for images %s" % image_skips)
            for skip in image_skips:
                self.kevt_streamc.add_skip(skip)

        self.kevent = KEvent(self.thread_registry)
        self.keventq = Queue()

        self._output_classes = dict(console=ConsoleOutput,
                                    amqp=AmqpOutput,
                                    smtp=SmtpOutput,
                                    elasticsearch=ElasticsearchOutput)
        self._outputs = self._construct_outputs()
        self.output_aggregator = OutputAggregator(self._outputs)

        if filament:
            filament.keventq = self.keventq
            filament.logger = log_path
            filament.setup_adapters(self._outputs)
        self._filament = filament

        self.fsio = FsIO(self.kevent, self._handles)
        self.hive_parser = HiveParser(self.kevent, self.thread_registry)
        self.tcpip_parser = TcpIpParser(self.kevent)
        self.dll_repository = DllRepository(self.kevent)
        self.context_switch_registry = ContextSwitchRegistry(self.thread_registry, self.kevent)

        self.output_kevents = {}
        self.filters_count = 0
예제 #10
0
from discord.ratelimits.main import RatelimitManager

from discord.gateway import websocket_handler
from discord.errors import DiscordError
from discord.gateway.state_manager import StateManager
from discord.storage import Storage
from discord.user_storage import UserStorage
from discord.dispatcher import EventDispatcher
from discord.presence import PresenceManager
from discord.images import IconManager
from discord.jobs import JobManager

from discord.utils import DiscordJSONEncoder

# setup logbook
handler = StreamHandler(sys.stdout, level=logbook.INFO)
handler.push_application()
log = Logger('discord.boot')
redirect_logging()


def make_app():
    app = Quart(__name__)
    app.config.from_object(f'config.{config.MODE}')
    is_debug = app.config.get('DEBUG', False)
    app.debug = is_debug

    if is_debug:
        log.info('on debug')
        handler.level = logbook.DEBUG
        app.logger.level = logbook.DEBUG
예제 #11
0
 def __init__(self, log_file):
     super().__init__()
     self.handlers.append(RotatingFileHandler(log_file, bubble=True))
     self.handlers.append(StreamHandler(sys.stdout))
예제 #12
0
    def run(self):
        """Worker runtime body.
        """
        # Logging:
        StreamHandler(sys.stdout).push_application()
        self.log = Logger('Worker_{}'.format(self.task), level=self.log_level)
        try:
            tf.reset_default_graph()

            if self.test_mode:
                import gym

            # Define cluster:
            cluster = tf.train.ClusterSpec(self.cluster_spec).as_cluster_def()

            # Start tf.server:
            if self.job_name in 'ps':
                server = tf.train.Server(
                    cluster,
                    job_name=self.job_name,
                    task_index=self.task,
                    config=tf.ConfigProto(device_filters=["/job:ps"]))
                self.log.debug('parameters_server started.')
                # Just block here:
                server.join()

            else:
                server = tf.train.Server(
                    cluster,
                    job_name='worker',
                    task_index=self.task,
                    config=tf.ConfigProto(
                        intra_op_parallelism_threads=1,  # original was: 1
                        inter_op_parallelism_threads=2  # original was: 2
                    ))
                self.log.debug('tf.server started.')

                self.log.debug('making environments:')
                # Making as many environments as many entries in env_config `port` list:
                # TODO: Hacky-II: only one example over all parallel environments can be data-master [and renderer]
                # TODO: measure data_server lags, maybe launch several instances
                self.env_list = []
                env_kwargs = self.env_kwargs.copy()
                env_kwargs['log_level'] = self.log_level
                port_list = env_kwargs.pop('port')
                data_port_list = env_kwargs.pop('data_port')
                data_master = env_kwargs.pop('data_master')
                render_enabled = env_kwargs.pop('render_enabled')

                render_list = [False for entry in port_list]
                if render_enabled:
                    if self.render_last_env:
                        render_list[-1] = True
                    else:
                        render_list = [True for entry in port_list]
                        # render_list[0] = True

                data_master_list = [False for entry in port_list]
                if data_master:
                    data_master_list[0] = True

                # Parallel envs. numbering:
                if len(port_list) > 1:
                    task_id = 0.0
                else:
                    task_id = 0

                for port, data_port, is_render, is_master in zip(
                        port_list, data_port_list, render_list,
                        data_master_list):
                    # Get random seed for environments:
                    env_kwargs['random_seed'] = random.randint(0, 2**30)

                    if not self.test_mode:
                        # Assume BTgym env. class:
                        self.log.debug(
                            'setting env at port_{} is data_master: {}'.format(
                                port, data_master))
                        self.log.debug('env_kwargs:')
                        for k, v in env_kwargs.items():
                            self.log.debug('{}: {}'.format(k, v))
                        try:
                            self.env_list.append(
                                self.env_class(port=port,
                                               data_port=data_port,
                                               data_master=is_master,
                                               render_enabled=is_render,
                                               task=self.task + task_id,
                                               **env_kwargs))
                            data_master = False
                            self.log.info(
                                'set BTGym environment {} @ port:{}, data_port:{}'
                                .format(self.task + task_id, port, data_port))
                            task_id += 0.01

                        except Exception as e:
                            self.log.exception(
                                'failed to make BTGym environment at port_{}.'.
                                format(port))
                            raise e

                    else:
                        # Assume atari testing:
                        try:
                            self.env_list.append(
                                self.env_class(env_kwargs['gym_id']))
                            self.log.debug('set Gyn/Atari environment.')

                        except Exception as e:
                            self.log.exception(
                                'failed to make Gym/Atari environment')
                            raise e

                self.log.debug('Defining trainer...')

                # Define trainer:
                trainer = self.trainer_class(
                    env=self.env_list,
                    task=self.task,
                    policy_config=self.policy_config,
                    log_level=self.log_level,
                    cluster_spec=self.cluster_spec,
                    random_seed=self.random_seed,
                    **self.trainer_kwargs,
                )

                self.log.debug('trainer ok.')

                # Saver-related:
                variables_to_save = [
                    v for v in tf.global_variables() if not 'local' in v.name
                ]
                local_variables = [
                    v for v in tf.global_variables() if 'local' in v.name
                ] + tf.local_variables()
                init_op = tf.initializers.variables(variables_to_save)
                local_init_op = tf.initializers.variables(local_variables)
                init_all_op = tf.global_variables_initializer()

                def init_fn(_sess):
                    self.log.notice("initializing all parameters...")
                    _sess.run(init_all_op)

                # def init_fn_scaff(scaffold, _sess):
                #     self.log.notice("initializing all parameters...")
                #     _sess.run(init_all_op)

                # self.log.warning('VARIABLES TO SAVE:')
                # for v in variables_to_save:
                #     self.log.warning(v)
                #
                # self.log.warning('LOCAL VARS:')
                # for v in local_variables:
                #     self.log.warning(v)

                self.saver = FastSaver(var_list=variables_to_save,
                                       max_to_keep=1,
                                       save_relative_paths=True)

                self.config = tf.ConfigProto(device_filters=[
                    "/job:ps", "/job:worker/task:{}/cpu:0".format(self.task)
                ])

                sess_manager = tf.train.SessionManager(
                    local_init_op=local_init_op,
                    ready_op=None,
                    ready_for_local_init_op=tf.report_uninitialized_variables(
                        variables_to_save),
                    graph=None,
                    recovery_wait_secs=90,
                )
                with sess_manager.prepare_session(
                        master=server.target,
                        init_op=init_op,
                        config=self.config,
                        init_fn=init_fn,
                ) as sess:

                    # Try to restore pre-trained model
                    pre_trained_restored = self._restore_model_params(
                        sess, self.initial_ckpt_dir)
                    _ = sess.run(trainer.reset_global_step)

                    if not pre_trained_restored:
                        # If not - try to recover current checkpoint:
                        current_restored = self._restore_model_params(
                            sess, self.current_ckpt_dir)

                    else:
                        current_restored = False

                    if not pre_trained_restored and not current_restored:
                        self.log.notice('training from scratch...')

                    self.log.info("connecting to the parameter server... ")

                    self.summary_writer = tf.summary.FileWriter(
                        self.summary_dir, sess.graph)
                    trainer.start(sess, self.summary_writer)

                    # Note: `self.global_step` refers to number of environment steps
                    # summarized over all environment instances, not to number of policy optimizer train steps.
                    global_step = sess.run(trainer.global_step)
                    self.log.notice(
                        "started training at step: {}".format(global_step))

                    last_saved_time = datetime.datetime.now()
                    last_saved_step = global_step

                    while global_step < self.max_env_steps:
                        trainer.process(sess)
                        global_step = sess.run(trainer.global_step)

                        time_delta = datetime.datetime.now() - last_saved_time
                        if self.is_chief and time_delta.total_seconds(
                        ) > self.save_secs:
                            self._save_model_params(sess, global_step)
                            train_speed = (global_step - last_saved_step) / (
                                time_delta.total_seconds() + 1)
                            self.log.notice(
                                'env. step: {}; cluster speed: {:.0f} step/sec; checkpoint saved.'
                                .format(global_step, train_speed))
                            last_saved_time = datetime.datetime.now()
                            last_saved_step = global_step

                # Ask for all the services to stop:
                for env in self.env_list:
                    env.close()

                self.log.notice(
                    'reached {} steps, exiting.'.format(global_step))

        except Exception as e:
            self.log.exception(e)
            raise e
예제 #13
0
파일: worker.py 프로젝트: tnet/btgym
    def run(self):
        """Worker runtime body.
        """
        # Logging:
        StreamHandler(sys.stdout).push_application()
        self.log = Logger('Worker_{}'.format(self.task), level=self.log_level)

        tf.reset_default_graph()

        if self.test_mode:
            import gym

        # Define cluster:
        cluster = tf.train.ClusterSpec(self.cluster_spec).as_cluster_def()

        # Start tf.server:
        if self.job_name in 'ps':
            server = tf.train.Server(
                cluster,
                job_name=self.job_name,
                task_index=self.task,
                config=tf.ConfigProto(device_filters=["/job:ps"]))
            self.log.debug('parameters_server started.')
            # Just block here:
            server.join()

        else:
            server = tf.train.Server(
                cluster,
                job_name='worker',
                task_index=self.task,
                config=tf.ConfigProto(
                    intra_op_parallelism_threads=1,  # original was: 1
                    inter_op_parallelism_threads=2  # original was: 2
                ))
            self.log.debug('tf.server started.')

            self.log.debug('making environments:')
            # Making as many environments as many entries in env_config `port` list:
            # TODO: Hacky-II: only one example of parallel [all] environments can be data-master and renderer
            # TODO: measure data_server lags, maybe launch several instances
            self.env_list = []
            env_kwargs = self.env_kwargs.copy()
            env_kwargs['log_level'] = self.log_level
            port_list = env_kwargs.pop('port')
            data_master = env_kwargs.pop('data_master')
            render_enabled = env_kwargs.pop('render_enabled')

            # Parallel envs. numbering:
            if len(port_list) > 1:
                task_id = 0.0
            else:
                task_id = 0

            for port in port_list:
                if not self.test_mode:
                    # Assume BTgym env. class:
                    self.log.debug('env at port_{} is data_master: {}'.format(
                        port, data_master))
                    try:
                        self.env_list.append(
                            self.env_class(port=port,
                                           data_master=data_master,
                                           render_enabled=render_enabled,
                                           task=self.task + task_id,
                                           **env_kwargs))
                        data_master = False
                        render_enabled = False
                        self.log.info(
                            'set BTGym environment {} at port_{}.'.format(
                                self.task + task_id, port))
                        task_id += 0.01

                    except:
                        self.log.exception(
                            'failed to make BTGym environment at port_{}.'.
                            format(port))
                        raise RuntimeError

                else:
                    # Assume atari testing:
                    try:
                        self.env_list.append(
                            self.env_class(env_kwargs['gym_id']))
                        self.log.debug('set Gyn/Atari environment.')

                    except:
                        self.log.exception(
                            'failed to make Gym/Atari environment')
                        raise RuntimeError

            # Define trainer:
            trainer = self.trainer_class(
                env=self.env_list,
                task=self.task,
                policy_config=self.policy_config,
                log_level=self.log_level,
                random_seed=self.random_seed,
                **self.trainer_kwargs,
            )

            self.log.debug('trainer ok.')

            # Saver-related:
            variables_to_save = [
                v for v in tf.global_variables()
                if not v.name.startswith("local")
            ]
            local_variables = [
                v for v in tf.global_variables() if v.name.startswith("local")
            ]
            init_op = tf.variables_initializer(variables_to_save)
            local_init_op = tf.variables_initializer(local_variables)
            init_all_op = tf.global_variables_initializer()

            saver = _FastSaver(variables_to_save)

            self.log.debug('vars_to_save:')
            for v in variables_to_save:
                self.log.debug('{}: {}'.format(v.name, v.get_shape()))

            def init_fn(ses):
                self.log.info("initializing all parameters.")
                ses.run(init_all_op)

            config = tf.ConfigProto(device_filters=[
                "/job:ps", "/job:worker/task:{}/cpu:0".format(self.task)
            ])
            logdir = os.path.join(self.log_dir, 'train')
            summary_dir = logdir + "_{}".format(self.task)

            summary_writer = tf.summary.FileWriter(summary_dir)

            sv = tf.train.Supervisor(
                is_chief=(self.task == 0),
                logdir=logdir,
                saver=saver,
                summary_op=None,
                init_op=init_op,
                local_init_op=local_init_op,
                init_fn=init_fn,
                #ready_op=tf.report_uninitialized_variables(variables_to_save),
                ready_op=tf.report_uninitialized_variables(),
                global_step=trainer.global_step,
                save_model_secs=300,
            )
            self.log.info("connecting to the parameter server... ")

            with sv.managed_session(server.target,
                                    config=config) as sess, sess.as_default():
                #sess.run(trainer.sync)
                trainer.start(sess, summary_writer)

                # Note: `self.global_step` refers to number of environment steps
                # summarized over all environment instances, not to number of policy optimizer train steps.
                global_step = sess.run(trainer.global_step)
                self.log.notice(
                    "started training at step: {}".format(global_step))

                while not sv.should_stop(
                ) and global_step < self.max_env_steps:
                    trainer.process(sess)
                    global_step = sess.run(trainer.global_step)

                # Ask for all the services to stop:
                for env in self.env_list:
                    env.close()

                sv.stop()
            self.log.notice('reached {} steps, exiting.'.format(global_step))
예제 #14
0
파일: Logger.py 프로젝트: yusea/CVTron
 def __init__(self, loggerName):
     StreamHandler(sys.stdout).push_application()
     self.logger = lg(loggerName)
예제 #15
0
파일: launcher.py 프로젝트: jreuben11/btgym
    def __init__(self,
                 env_config=None,
                 cluster_config=None,
                 policy_config=None,
                 trainer_config=None,
                 max_env_steps=None,
                 root_random_seed=None,
                 test_mode=False,
                 purge_previous=0,
                 log_level=None,
                 verbose=0):
        """


        Args:
            env_config (dict):          environment class_config_dict, see 'Note' below.
            cluster_config (dict):      tf cluster configuration, see 'Note' below.
            policy_config (dict):       policy class_config_dict holding corr. policy class args.
            trainer_config (dict):      trainer class_config_dict holding corr. trainer class args.
            max_env_steps (int):        total number of environment steps to run training on.
            root_random_seed (int):     int or None
            test_mode (bool):           if True - use Atari gym env., BTGym otherwise.
            purge_previous (int):       keep or remove previous log files and saved checkpoints from log_dir:
                                        {0 - keep, 1 - ask, 2 - remove}.
            verbose (int):              verbosity mode, {0 - WARNING, 1 - INFO, 2 - DEBUG}.
            log_level (int):            logbook level {DEBUG=10, INFO=11, NOTICE=12, WARNING=13},
                                        overrides `verbose` arg.

        Note:
            class_config_dict:  dictionary containing at least two keys:
                                - `class_ref`:    reference to class constructor or function;
                                - `kwargs`:       dictionary of keyword arguments, see corr. environment class args.

            cluster_config:     dictionary containing at least these keys:
                                - 'host':         cluster host, def: '127.0.0.1'
                                - 'port':         cluster port, def: 12222
                                - 'num_workers':  number of workers to run, def: 1
                                - 'num_ps':       number of parameter servers, def: 1
                                - 'num_envs':     number of environments to run in parallel for each worker, def: 1
                                - 'log_dir':      directory to save model and summaries, def: './tmp/btgym_aac_log'

        """

        self.env_config = dict(class_ref=None,
                               kwargs=dict(
                                   port=5000,
                                   data_port=4999,
                                   gym_id=None,
                               ))
        self.cluster_config = dict(
            host='127.0.0.1',
            port=12222,
            num_workers=1,
            num_ps=1,
            log_dir='./tmp/btgym_aac_log',
            num_envs=1,
        )
        self.policy_config = dict(class_ref=BaseAacPolicy,
                                  kwargs=dict(lstm_layers=(256, )))
        self.trainer_config = dict(class_ref=A3C, kwargs={})
        self.max_env_steps = 100 * 10**6
        self.ports_to_use = []
        self.root_random_seed = root_random_seed
        self.purge_previous = purge_previous
        self.test_mode = test_mode
        self.log_level = log_level
        self.verbose = verbose

        if max_env_steps is not None:
            self.max_env_steps = max_env_steps

        self.env_config = self._update_config_dict(self.env_config, env_config)

        self.cluster_config = self._update_config_dict(self.cluster_config,
                                                       cluster_config)

        self.policy_config = self._update_config_dict(self.policy_config,
                                                      policy_config)

        self.trainer_config = self._update_config_dict(self.trainer_config,
                                                       trainer_config)

        self.trainer_config['kwargs']['test_mode'] = self.test_mode

        # Logging config:
        StreamHandler(sys.stdout).push_application()
        if self.log_level is None:
            log_levels = [(0, NOTICE), (1, INFO), (2, DEBUG)]
            self.log_level = WARNING
            for key, value in log_levels:
                if key == self.verbose:
                    self.log_level = value
        self.log = Logger('LauncherShell', level=self.log_level)

        # Seeding:
        if self.root_random_seed is not None:
            np.random.seed(self.root_random_seed)
        self.log.info('Random seed: {}'.format(self.root_random_seed))

        # Seeding for workers:
        workers_rnd_seeds = list(
            np.random.randint(
                0, 2**30, self.cluster_config['num_workers'] +
                self.cluster_config['num_ps']))

        # Log_dir:
        if os.path.exists(self.cluster_config['log_dir']):
            # Remove previous log files and saved model if opted:
            if self.purge_previous > 0:
                confirm = 'y'
                if self.purge_previous < 2:
                    confirm = input(
                        '<{}> already exists. Override[y/n]? '.format(
                            self.cluster_config['log_dir']))
                if confirm in 'y':
                    files = glob.glob(self.cluster_config['log_dir'] + '/*')
                    p = psutil.Popen([
                        'rm',
                        '-R',
                    ] + files,
                                     stdout=PIPE,
                                     stderr=PIPE)
                    self.log.notice('Files in <{}> purged.'.format(
                        self.cluster_config['log_dir']))

            else:
                self.log.notice('Appending to <{}>.'.format(
                    self.cluster_config['log_dir']))

        else:
            os.makedirs(self.cluster_config['log_dir'])
            self.log.notice('<{}> created.'.format(
                self.cluster_config['log_dir']))

        for kwarg in ['port', 'data_port']:
            assert kwarg in self.env_config['kwargs'].keys()

        assert self.env_config['class_ref'] is not None

        # Make cluster specification dict:
        self.cluster_spec = self.make_cluster_spec(self.cluster_config)

        # Configure workers:
        self.workers_config_list = []
        env_ports = np.arange(self.cluster_config['num_envs'])
        worker_port = self.env_config['kwargs'][
            'port']  # start value for BTGym comm. port

        # TODO: Hacky, cause dataset is threadlocked; do: pass dataset as class_ref + kwargs_dict:
        if self.test_mode:
            dataset_instance = None

        else:
            dataset_instance = self.env_config['kwargs'].pop('dataset')

        for key, spec_list in self.cluster_spec.items():
            task_index = 0  # referenced farther as worker id
            for _id in spec_list:
                env_config = copy.deepcopy(self.env_config)
                worker_config = {}
                if key in 'worker':
                    # Configure worker BTgym environment:
                    if task_index == 0:
                        env_config['kwargs'][
                            'data_master'] = True  # set worker_0 as chief and data_master
                        env_config['kwargs']['dataset'] = dataset_instance
                        env_config['kwargs']['render_enabled'] = True
                    else:
                        env_config['kwargs']['data_master'] = False
                        env_config['kwargs'][
                            'render_enabled'] = False  # disable rendering for all but chief

                    # Add list of connection ports for every parallel env for each worker:
                    env_config['kwargs']['port'] = list(worker_port +
                                                        env_ports)
                    worker_port += self.cluster_config['num_envs']
                worker_config.update({
                    'env_config': env_config,
                    'policy_config': self.policy_config,
                    'trainer_config': self.trainer_config,
                    'cluster_spec': self.cluster_spec,
                    'job_name': key,
                    'task': task_index,
                    'test_mode': self.test_mode,
                    'log_dir': self.cluster_config['log_dir'],
                    'max_env_steps': self.max_env_steps,
                    'log_level': self.log_level,
                    'random_seed': workers_rnd_seeds.pop()
                })
                self.clear_port(env_config['kwargs']['port'])
                self.workers_config_list.append(worker_config)
                task_index += 1

        self.clear_port(self.env_config['kwargs']['data_port'])
        self.log.debug('Launcher ready.')
예제 #16
0
import os
import re
import sys

import pymysql
import datetime

from pymongo import MongoClient

from logbook import Logger, StreamHandler, TimedRotatingFileHandler

stream_log = StreamHandler(sys.stdout)
stream_log.push_application()

log_file = TimedRotatingFileHandler(os.path.join(os.getcwd(), "index.log"),
                                    backup_count=3)
logger = Logger('Logbook')

logger.handlers = []
# logger.handlers.append(log_file)
logger.handlers.append(stream_log)

env = os.environ.get
stock_format = [r'^[SI][ZHX]\d{6}$', r'^\d{6}\.[A-Z]{4}$']


def little8code(x):
    """
    转换为前缀模式
    :param x:
    :return:
예제 #17
0
def create_logger():
    """ Creates the logger fpr this module. """
    StreamHandler(sys.stdout).push_application()
    return Logger('PhotoBackup')
예제 #18
0
@ __mtime__: 2016/8/12 19:07

日志格式 测试

配置日志格式两种方式:
a) 传 格式 字符串
b)hook format function

"""

from logbook import StreamHandler, info
import sys

# 1. set format_string
sh = StreamHandler(
    sys.stdout,
    format_string=
    "[{record.time}] {record.level_name}: {record.channel}:{record.message}")

# 2. set format_string
sh.format_string = "[{record.time}] {record.level_name}: {record.channel}:{record.message}"


# 3. invoke the format function
def my_format_fun(record, handler):
    return " ".join([
        "[" + str(record.time) + "]",
        record.level_name + ":" + record.channel + ":", record.message
    ])


sh.formatter = my_format_fun
예제 #19
0
        prefix = args.vocab[0]
        args.vocab = [f'{prefix}.{args.langs[0]}', f'{prefix}.{args.langs[1]}']

    return args, state_dict, resume


if __name__ == '__main__':
    args, state_dict, resume = prepare()

    # redirect stdout and stderr to log file
    # redirection = open(log_name, 'a', buffering=1)
    # sys.stdout = redirection
    # sys.stderr = redirection

    stdout_handler = StreamHandler(sys.stdout, bubble=True)
    stderr_handler = StderrHandler(level=WARNING)
    # write logs to log.MODEL file
    # file_handler = FileHandler(log_name, bubble=True)
    # file_handler.format_string = '{record.message},{record.extra[cwd]}'
    # file_handler.format_string = '[{record.time:%Y-%m-%d %H:%M:%S.%f%z}] {record.level_name}: {record.message}'
    # with file_handler.applicationbound():
    stdout_handler.format_string = '[{record.time:%Y-%m-%d %H:%M:%S.%f%z}] ' \
                                   '{record.level_name}: {record.message}'
    with stdout_handler.applicationbound():
        if resume:
            logger.info(
                f'Resume training from checkpoint: {Loader.get_latest(args.model)[1]}'
            )

        try:
def run():
    out = StringIO()
    with StreamHandler(out):
        for x in xrange(500):
            log.warning('this is not handled')
    assert out.getvalue().count('\n') == 500
예제 #21
0
import sys

from flask import Blueprint, jsonify, request
from logbook import Logger, StreamHandler
import requests

from tldr.models import Article
from tldr.utils import summarize_text

apiv1_module = Blueprint('apiv1', __name__, template_folder='templates')

log = Logger(__name__)
log.handlers.append(StreamHandler(sys.stdout, level='INFO'))


# TODO: Make this more generic
# TODO: Move elsewhere
def json_requested():
    """Determines whether the requested content type is application/json."""
    best = request.accept_mimetypes \
        .best_match(['application/json', 'text/plain'])
    return best == 'application/json' and \
        request.accept_mimetypes[best] > \
        request.accept_mimetypes['text/plain']


@apiv1_module.route('summarize', methods=['POST'])
def summarize():
    """Summarizes given text."""
    text = request.form['text']
    return summarize_text(text)
예제 #22
0
import re
import sys
from typing import AnyStr
from typing import Sequence

import progressbar
from dateutil import relativedelta
from logbook import Logger, StreamHandler

from rs2wat import db

DIR_LISTING_PAT = r"([0-9]{2}-[0-9]{2}-[0-9]{2}\s{2}[0-9]{2}:[0-9]{2}\w{2})\s*(\d*) (.*)"
DIR_LISTING_TIME_FMT = "%m-%d-%y  %I:%M%p"
RS2_LOG_DATE_FMT = "%m/%d/%y %H:%M:%S"

StreamHandler(sys.stdout, level="INFO").push_application()
logger = Logger(__name__)


class ProgressFile(object):
    """
    TODO: fix progress bar only updating once download is finished.
    """
    def __init__(self, file_path, mode, max_value=progressbar.UnknownLength):
        self.file_obj = open(file_path, mode)
        fct = progressbar.FormatCustomText("%(f)s", dict(f=""))
        self.progressbar = progressbar.ProgressBar(
            max_value=max_value,
            widgets=[
                progressbar.Counter(format='[%(value)02d/%(max_value)d]'),
                progressbar.Bar(marker=u'\u2588',
예제 #23
0
        for index, txo in enumerate(tx_obj.txs_out):
            if _script_hash(txo.puzzle_script()) in script_hashes:
                utxos[(txid, index)] = txo

        diff = sum(txo.coin_value for txo in utxos.values()) - balance
        balance += diff
        confirmations = tip['height'] - block_height + 1
        rows.append([
            txid, timestamps_map[block_height], block_height, confirmations,
            f'{diff/1e5:,.5f}', f'{balance/1e5:,.5f}'
        ])
    show_rows(rows, [
        "txid", "block timestamp", "height", "confirmations", "delta (mBTC)",
        "total (mBTC)"
    ])

    tip_header = _parse_header(tip['hex'])
    log.info('tip={}, height={} @ {}', tip_header.id(), tip['height'],
             _parse_timestamp(tip_header))

    unconfirmed = {
        txs_map[txid]
        for txid, height in txids_map.items() if height is None
    }
    # TODO: show unconfirmed balance


if __name__ == '__main__':
    StreamHandler(sys.stderr).push_application()
    main()
예제 #24
0
import subprocess
import sys
import time

from logbook import Logger
from logbook import StreamHandler
from rs2wapy import RS2WebAdmin

from simplediscordwh import DiscordWebhook

WEBHOOK_URL = os.environ["WEBHOOK_URL"]
WA_USERNAME = os.environ["WA_USERNAME"]
WA_PASSWORD = os.environ["WA_PASSWORD"]
WA_URL = os.environ["WA_URL"]

handler = StreamHandler(sys.stdout, level="INFO")
handler.format_string = (
    "[{record.time}] {record.level_name}: {record.module}: "
    "{record.func_name}: Process({record.process}): {record.message}")
logger = Logger(__name__)
logger.handlers.append(handler)


def write_exception(e):
    try:
        e = f"{datetime.datetime.now().isoformat()}: {type(e)}: {e}\n"
        print(e)
        with open("errors.log", "a") as f:
            f.write(e)
            f.write("----------------\n")
    except Exception as e:
예제 #25
0
def run(
    driver,
    email,
    password,
    keep_creds,
    output_dir,
    scrape_only,
    resume_only,
    website_only,
    profile_file,
    timeout,
    driver_path,
    **kwargs,
):
    # Setup logging
    logbook.set_datetime_format("local")
    format_string = (
        "[{record.time:%Y-%m-%d %H:%M:%S}] {record.level_name}: {record.message}"
    )
    StreamHandler(sys.stdout, format_string=format_string).push_application()
    log = Logger()

    # Create output directory
    make_dir(output_dir)

    # Check if user has provided the profile json file
    if profile_file is None:
        if driver.lower() not in DRIVERS:
            raise ValueError(
                f'Browser driver has to be one of these: {", ".join(DRIVERS)}')

        # Check if credentials file exists
        credentials_file = os.path.expanduser(CREDENTIALS_FILE)
        if os.path.exists(credentials_file):
            with open(credentials_file) as f:
                credentials = json.load(f)
                email = credentials["email"]
                password = credentials["password"]
        else:
            if email is None:
                email = input("Enter your LinkedIn login email: ")
            if password is None:
                password = getpass("Enter your LinkedIn login password: "******"Scraping LinkedIn profile")
        if driver not in [CHROME, FIREFOX]:
            log.notice("Please keep the browser window on top")

        profile = scrape(driver.lower(), driver_path, email, password,
                         output_dir, timeout)

        if keep_creds:
            store_creds(email, password, credentials_file)
    else:
        with open(profile_file) as f:
            profile = json.load(f)

    if not scrape_only:
        if resume_only:
            make_resume_files(profile, output_dir, timeout)
        elif website_only:
            make_website_files(profile, output_dir)
        else:
            make_resume_files(profile, output_dir, timeout)
            make_website_files(profile, output_dir)
예제 #26
0
def main():
    # Setup logging
    logging.getLogger("pdfminer").setLevel(logging.WARNING)
    logging.getLogger("ocrmypdf").setLevel(logging.WARNING)
    redirect_logging()
    format_string = "{record.level_name}: {record.message}"
    StreamHandler(
        sys.stdout, format_string=format_string, level="INFO"
    ).push_application()
    log = Logger()

    q = mq.MessageQueue(all_burst_limit=3, all_time_limit_ms=3000)
    request = Request(con_pool_size=8)
    pdf_bot = MQBot(TELE_TOKEN, request=request, mqueue=q)

    # Create the EventHandler and pass it your bot's token.
    updater = Updater(
        bot=pdf_bot,
        use_context=True,
        request_kwargs={"connect_timeout": TIMEOUT, "read_timeout": TIMEOUT},
    )

    def stop_and_restart():
        updater.stop()
        os.execl(sys.executable, sys.executable, *sys.argv)

    def restart(_):
        Thread(target=stop_and_restart).start()

    job_queue = updater.job_queue
    job_queue.run_repeating(restart, interval=dt.timedelta(minutes=30))

    # Get the dispatcher to register handlers
    dispatcher = updater.dispatcher

    # General commands handlers
    dispatcher.add_handler(CommandHandler("start", start_msg, run_async=True))
    dispatcher.add_handler(CommandHandler("help", help_msg, run_async=True))
    dispatcher.add_handler(CommandHandler("setlang", send_lang, run_async=True))
    dispatcher.add_handler(
        CommandHandler("support", send_support_options, run_async=True)
    )
    dispatcher.add_handler(CommandHandler("send", send_msg, Filters.user(DEV_TELE_ID)))
    dispatcher.add_handler(
        CommandHandler("stats", get_stats, Filters.user(DEV_TELE_ID))
    )

    # Callback query handler
    dispatcher.add_handler(CallbackQueryHandler(process_callback_query, run_async=True))

    # Payment handlers
    dispatcher.add_handler(PreCheckoutQueryHandler(precheckout_check, run_async=True))
    dispatcher.add_handler(
        MessageHandler(Filters.successful_payment, successful_payment, run_async=True)
    )

    # URL handler
    dispatcher.add_handler(
        MessageHandler(Filters.entity(MessageEntity.URL), url_to_pdf, run_async=True)
    )

    # PDF commands handlers
    dispatcher.add_handler(compare_cov_handler())
    dispatcher.add_handler(merge_cov_handler())
    dispatcher.add_handler(photo_cov_handler())
    dispatcher.add_handler(text_cov_handler())
    dispatcher.add_handler(watermark_cov_handler())

    # PDF file handler
    dispatcher.add_handler(file_cov_handler())

    # Feedback handler
    dispatcher.add_handler(feedback_cov_handler())

    # Log all errors
    dispatcher.add_error_handler(error_callback)

    # Start the Bot
    if APP_URL is not None:
        updater.start_webhook(
            listen="0.0.0.0",
            port=PORT,
            url_path=TELE_TOKEN,
            webhook_url=APP_URL + TELE_TOKEN,
        )
        log.notice("Bot started webhook")
    else:
        updater.start_polling()
        log.notice("Bot started polling")

    # Run the bot until the you presses Ctrl-C or the process receives SIGINT,
    # SIGTERM or SIGABRT. This should be used most of the time, since
    # start_polling() is non-blocking and will stop the bot gracefully.
    updater.idle()
예제 #27
0
파일: xpub.py 프로젝트: sickpig/ElectrsCash
    conn = client.Client(('localhost', 50001))
    xpub, = sys.argv[1:]
    total = 0
    k = pycoin.ui.key_from_text.key_from_text(xpub)
    for change in (0, 1):
        empty = 0
        for n in range(100):
            address = k.subkey(change).subkey(n).address()
            script = script_for_address(address)
            script_hash = hashlib.sha256(script).digest()[::-1].hex()
            log.debug('{}', conn.call('blockchain.scripthash.get_history',
                                      script_hash))
            reply = conn.call('blockchain.scripthash.get_balance', script_hash)
            result = reply['result']
            confirmed = result['confirmed'] / 1e8
            total += confirmed
            if confirmed:
                log.info('{}/{} => {} has {:11.8f} BTC',
                         change, n, address, confirmed)
                empty = 0
            else:
                empty += 1
                if empty >= 10:
                    break
    log.info('total balance: {} BTC', total)


if __name__ == '__main__':
    with StreamHandler(sys.stderr, level='INFO').applicationbound():
        main()
예제 #28
0
파일: log.py 프로젝트: qoneci/notify
def logger():
    StreamHandler(sys.stdout).push_application()
    return Logger(LOG_BASE)
예제 #29
0
import csv
import os
import random
import sys

from logbook import Logger, StreamHandler

StreamHandler(sys.stdout).push_application()
log = Logger('TyphoonNames')

header = []
rows = []

with open(os.path.join(os.path.dirname(__file__), "retired-typhoon-names.csv"),
          "r") as csvfile:
    reader = csv.reader(csvfile)
    header.extend(next(reader))

    for row in reader:
        info = {header[i]: v if v else None for i, v in enumerate(row)}
        rows.append(info)

sample = {
    'Name': 'Karen',
    'Replacement name': None,
    'Dates active': 'November 7\xa01 17, 1962',
    'Peak classification': 'Category\xa05 super typhoon',
    'Sustained wind speeds': '295\xa0km/h (185\xa0mph)',
    'Pressure': '894\xa0hPa (26.40\xa0inHg)',
    'Areas affected': 'Guam',
    'Damage\xa0(USD)': '$250\xa0million',
예제 #30
0
class Mysql(object):
    StreamHandler(sys.stdout).push_application()
    logger = Logger('Mysql')
    # 连接数据库

    # 生产环境数据库
    __config = {
        'host': 'localhost',
        'port': 3306,
        'user': '******',
        'password': '******',
        'db': 'yilongspider',
        'charset': 'utf8',
        'cursorclass': pymysql.cursors.DictCursor,
    }

    # 数据库构造函数,从连接池中取出连接,并生成操作游标
    def __init__(self):
        """
        配置成员变量
        """
        # 连接对象
        self.__conn = self.__getConn()
        self.__cursor = self.__getCursor()

    def __getConn(self):
        """
        获取con连接
        :return:  con
        """
        self.__conn = pymysql.Connect(**Mysql.__config)
        return self.__conn

    def __getCursor(self):
        """
        获取游标
        :return: cursor
        """
        self.__cursor = self.__conn.cursor()
        return self.__cursor

    @contextmanager
    def __con_cursor(self):
        """
        1、定义上下文管理器,连接后自动关闭连接
        2、元组对象前面如果不带“*”、字典对象如果前面不带“**”,则作为普通的对象传递参数。
        :return:
        """
        # 打开连接
        conn = self.__getConn()
        # 打开游标
        cursor = self.__getCursor()

        try:
            yield cursor
        except Exception as ex:
            conn.rollback()
            Mysql.logger.error(repr(ex))
        finally:
            self.__conn.commit()
            self.__cursor.close()
            self.__conn.close()

    # ---------- 搜索 ----------

    def __query(self, cursor, sql, param=None):
        if param:
            count = cursor.execute(sql, param)
        else:
            count = cursor.execute(sql)
        return count

    def getOne(self, sql, param=None):
        """
        @summary: 执行查询,并取出第一条
        @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
        @param param: 可选参数,条件列表值(元组/列表)
        @return: result list/boolean 查询到的结果集
        """

        with self.__con_cursor() as cursor:
            if self.__query(cursor, sql, param) > 0:
                result = cursor.fetchone()
            else:
                result = False
            return result

    def getMany(self, sql, param=None, num=1):
        """
        @summary: 执行查询,并取出num条结果
        @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
        @param num:取得的结果条数
        @param param: 可选参数,条件列表值(元组/列表)
        @return: result list/boolean 查询到的结果集
        """
        with self.__con_cursor() as cursor:
            if self.__query(cursor, sql, param) > 0:
                result = cursor.fetchmany(num)
            else:
                result = False
            return result

    def getAll(self, sql, param=None):
        """
        @summary: 执行查询,并取出所有结果集
        @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
        @param param: 可选参数,条件列表值(元组/列表)
        @return: result list(字典对象)/boolean 查询到的结果集
        """

        with self.__con_cursor() as cursor:
            if self.__query(cursor, sql, param) > 0:
                result = cursor.fetchall()
            else:
                result = False
            return result

    def __select(self, table, cond_dict=None, order=None):
        """
        @summary: 执行条件查询,并取出所有结果集
        @cond_dict:{'name':'xiaoming'...}
        @order:'order by id desc'
        @return:  result ({"col":"val","":""},{})
        """
        consql = ' '
        if cond_dict != '':
            for k, v in cond_dict.items():
                consql = consql + k + '=' + v + ' and'
        consql = consql + ' 1=1 '
        sql = 'select * from %s where ' % table
        sql = sql + consql + order
        print('_select:' + sql)
        return self.exeCute(sql)

    # ---------- 更新 ----------

    def update(self, sql, param=None):
        """
        @summary: 更新数据表记录
        @param sql: SQL格式及条件,使用(%s,%s)
        @param param: 要更新的  值 tuple/list
        @return: count 受影响的行数
        """
        with self.__con_cursor() as cursor:
            return cursor.execute(sql, param)

    # ---------- 删除 ----------

    def delete(self, sql, param=None):
        """
        @summary: 删除数据表记录
        @param sql: SQL格式及条件,使用(%s,%s)
        @param param: 要删除的条件 值 tuple/list
        @return: count 受影响的行数
        """

        with self.__con_cursor() as cursor:
            return cursor.execute(sql, param)

    # ---------- 插入 ----------

    # 插入一条/多条数据
    def insert(self, sql, param):
        """
        @summary: 向数据表插入一条记录
        @param sql:要插入的SQL格式
        @param value:要插入的记录数据tuple/list
        @return: insertId
        """
        with self.__con_cursor() as cursor:
            # 执行插入操作
            cursor.executemany(sql, param)
            # cursor.execute(sql)
            # 获取最后更新的ID
            return cursor.lastrowid


#if __name__ == '__main__':
#aaa = Mysql()
# print(aaa.getOne("select * from erp_users"))
# print(aaa.getOne("select * from erp_users WHERE id in(%s)", (19,)))
# for item in aaa.getMany("select * from erp_users WHERE id in(19,39)", None, 5):
#     print(item)
# for item in aaa.getAll("select name from erp_users ORDER BY `name` asc"):
#     print(item)
# for item in aaa.getAll("select * from erp_users WHERE id in(%s)", (19,)):
#     print(item)
# print(aaa.update("UPDATE erp_users SET mail =%s WHERE id = %s", ('123@789', 19)))
# print(aaa.delete("DELETE erp_users WHERE id = %s", (19,)))
# print(aaa.getInsertId())
# 插入一条数据
# print(aaa.insert("INSERT `erp_areas` (`areaName`,`charge`,`areaCode`,`is_delete`,`commission`) VALUES (%s,%s,%s,%s,%s)", ('通州片区2222ssssssd', '片区经理3', '0', '0', '0.90')))
# 插入多条数据
# print(aaa.insert("INSERT `erp_areas` (`areaName`,`charge`,`areaCode`,`is_delete`,`commission`) VALUES (%s,%s,%s,%s,%s)", ('通州片区2222ssssssd', '片区经理3', '0', '0', '0.90'), ('通州片区2222ssssssd', '片区经理3', '0','0', '0.90')))