A collection of Python library code for building Python applications.

Overview

Abseil Python Common Libraries

This repository is a collection of Python library code for building Python applications. The code is collected from Google's own Python code base, and has been extensively tested and used in production.

Features

  • Simple application startup
  • Distributed commandline flags system
  • Custom logging module with additional features
  • Testing utilities

Getting Started

Installation

To install the package, simply run:

pip install absl-py

Or install from source:

python setup.py install

Running Tests

To run Abseil tests, you can clone the git repo and run bazel:

git clone https://github.com/abseil/abseil-py.git
cd abseil-py
bazel test absl/...

Example Code

Please refer to smoke_tests/sample_app.py as an example to get started.

Documentation

See the Abseil Python Developer Guide.

Future Releases

The current repository includes an initial set of libraries for early adoption. More components and interoperability with Abseil C++ Common Libraries will come in future releases.

License

The Abseil Python library is licensed under the terms of the Apache license. See LICENSE for more information.

Comments
  • abseil interferes with python logging

    abseil interferes with python logging

    I have a script where I'm importing a module that internally uses abseil logging. The rest of our code base is using standard python logging. This is leading to a situation where importing that module is interfering with the rest of the code base using standard logging and causing lost log messages.

    See here for a description of the issue: https://github.com/tensorflow/hub/issues/263

    Have others run into this issue before?

    opened by matteby 19
  • Issues pickling/unpickling Flags with dill

    Issues pickling/unpickling Flags with dill

    I came across this issue when using the save_main_session in Apache Beam 2.4.0 with absl.flags (absl-py version 0.2.1). save_main_session pickles then unpickles the variables in the main session, flags.FLAGS included.

    The following error is raised:

    Traceback (most recent call last):
      File "test.py", line 46, in <module>
        app.run(main)
      File "venv/local/lib/python2.7/site-packages/absl/app.py", line 274, in run
        _run_main(main, args)
      File "venv/local/lib/python2.7/site-packages/absl/app.py", line 238, in _run_main
        sys.exit(main(argv))
      File "test.py", line 43, in main
        _ = output | beam.io.WriteToText(FLAGS.output_file)
      File "venv/local/lib/python2.7/site-packages/apache_beam/pipeline.py", line 389, in __exit__
        self.run().wait_until_finish()
      File "venv/local/lib/python2.7/site-packages/apache_beam/pipeline.py", line 369, in run
        self.to_runner_api(), self.runner, self._options).run(False)
      File "venv/local/lib/python2.7/site-packages/apache_beam/pipeline.py", line 379, in run
        pickler.dump_session(os.path.join(tmpdir, 'main_session.pickle'))
      File "venv/local/lib/python2.7/site-packages/apache_beam/internal/pickler.py", line 242, in dump_session
        dill.load_session(file_path)
      File "venv/local/lib/python2.7/site-packages/dill/dill.py", line 363, in load_session
        module = unpickler.load()
      File "/usr/lib/python2.7/pickle.py", line 864, in load
        dispatch[key](self)
      File "/usr/lib/python2.7/pickle.py", line 1221, in load_build
        setstate = getattr(inst, "__setstate__", None)
      File "venv/local/lib/python2.7/site-packages/absl/flags/_flagvalues.py", line 468, in __getattr__
        fl = self._flags()
      File "venv/local/lib/python2.7/site-packages/absl/flags/_flagvalues.py", line 141, in _flags
        return self.__dict__['__flags']
    KeyError: '__flags'
    

    Example code:

    """
    Demonstrating incompatibility between absl.flags and
    save_main_session in Apache Beam's Python SDK.
    """
    import re
    import six
    import apache_beam as beam
    
    from absl import app
    from absl import flags
    
    
    FLAGS = flags.FLAGS
    
    flags.DEFINE_string(
        'output_file',
        'output.txt',
        help='Output filename.')
    
    def main(argv):
      del argv # Unused.
    
      pipeline_options = beam.pipeline.PipelineOptions()
      # Uncomment the next line to break things.
      #pipeline_options.view_as(beam.pipeline.SetupOptions).save_main_session = True
    
      with beam.Pipeline(options=pipeline_options) as p:
        lines = p | beam.Create(
          ['This is a test of compatibility issues between absl and beam.',
           'Since absl.flags cannot be pickled correctly, it cannot be used',
           'with the save_main_session pipeline option.'])
    
        counts = (
            lines
            | 'Split' >> (beam.FlatMap(lambda x: re.findall(r'[A-Za-z\']+', x))
                          .with_output_types(six.text_type))
            | 'PairWithOne' >> beam.Map(lambda x: (x, 1))
            | 'GroupAndSum' >> beam.CombinePerKey(sum))
    
        output = counts | 'Format' >> beam.Map(
          lambda (word, count): '%s: %s' % (word, count))
    
        _ = output | beam.io.WriteToText(FLAGS.output_file)
    
    if __name__ == '__main__':
      app.run(main)
    
    opened by rasmi 17
  • pip install error when old setuptools versions used

    pip install error when old setuptools versions used

    python 3.6.7, install tensorflow, here is log:

    Collecting absl-py>=0.1.6 (from tensorflow->-r pip_requirenents.txt (line 21)) Using cached https://files.pythonhosted.org/packages/fa/ef/1fa0376563b1e0495301ada8e881d88b7ebfda433f6b31f44447fe6ef795/absl-py-0.6.0.tar.gz Complete output from command python setup.py egg_info: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/distutils/dist.py:261: UserWarning: Unknown distribution option: 'long_description_content_type' warnings.warn(msg) error in absl-py setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers; Expected version spec in enum34; python_version<='3.4' at ; python_version<='3.4'

    opened by o0starshine0o 14
  • how to write log into file

    how to write log into file

    Hi, I am trying to write log into file directly instead of showing in command window. I have seen following issues about it https://github.com/abseil/abseil-py/issues/83 https://github.com/abseil/abseil-py/issues/111

    I tried them but I cant see anything in the file.

    My code is

    import os
    from absl import logging
    if not os.path.exists('/opt/log/'):
         os.makedirs('/opt/log/')
    logging.get_absl_handler().use_absl_log_file('absl_logging', '/opt/log/')
    
    logging.info('test')
    logging.debug('test debug')
    

    I cant see anything in that file though file was created

    opened by akter-sust 12
  • How should I run bazel tests ?

    How should I run bazel tests ?

    Hi there,

    I added the WORKSPACE file from GitHub into the package published on pypi, but when I run

    bazel test absl
    

    It says:

    ERROR: no targets found beneath 'absl'.
    INFO: Elapsed time: 0.105s
    ERROR: Couldn't start the build. Unable to run tests.
    

    Thanks

    opened by eLvErDe 10
  • assertSameStructure with dict vs defaultdict

    assertSameStructure with dict vs defaultdict

    When trying to use assertSameStructure to compar a dict to a defaultdict, it throws an error. This is due to the direct type comparison here https://github.com/abseil/abseil-py/blob/master/absl/testing/absltest.py#L1219

    Not sure if it's worth adding another exception similar to int vs long. Feel free to close if this is WAI

    opened by EhsanKia 8
  • How to clean flags ?

    How to clean flags ?

    Hello dear friends,

    A few weeks ago, Tensorflow have moved to this library to manage flags using tf.app.flags. Link to file: https://github.com/tensorflow/tensorflow/blob/r1.5/tensorflow/python/platform/flags.py

    I can't manage to find any way to "reset" the flags state with this library. Is there any way to do this ?

    I would like to remove every flags created and return to a blank state as if it was just created.

    Thanks a lot.

    opened by DEKHTIARJonathan 8
  • AttributeError: module 'absl' has no attribute 'flags'

    AttributeError: module 'absl' has no attribute 'flags'

    Traceback (most recent call last): File "DeepSpeech.py", line 11, in import absl.app File "/home/sehar/venv/lib/python3.6/site-packages/absl/app.py", line 40, in from absl import flags File "/home/sehar/venv/lib/python3.6/site-packages/absl/flags/init.py", line 41, in from absl.flags import _defines File "/home/sehar/venv/lib/python3.6/site-packages/absl/flags/_defines.py", line 31, in from absl.flags import _flagvalues File "/home/sehar/venv/lib/python3.6/site-packages/absl/flags/_flagvalues.py", line 27, in import logging File "/home/sehar/DeepSpeech/logging.py", line 6, in from util.flags import FLAGS File "/home/sehar/DeepSpeech/util/flags.py", line 6, in FLAGS = absl.flags.FLAGS AttributeError: module 'absl' has no attribute 'flags' please help me resolve this issue I am using tensorflow 1.14 gpu based

    opened by sehargul-123 6
  • Fixing enum34 requirement for python versions <= 3.4 in setup.py

    Fixing enum34 requirement for python versions <= 3.4 in setup.py

    Was running into error on Python3.6 and pip 18.1

    error in absl-py setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers; Expected version spec in enum34;python_version<='3.4' at ;python_version<='3.4'
    

    Using the install_requires and extra_requires fixed my problems, and is ostensibly a better way to do this see reference here.

    cla: yes 
    opened by alexhagen 6
  • Logging disappeared after switching from app.run(main) to main()

    Logging disappeared after switching from app.run(main) to main()

    There are two logging methods in our code:

    import logging
    logging.info('my logging msg')
    

    or

    import logging
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    logger.info('my logger msg')
    

    When we first used app.run(main), everything is fine. All the log lines are output in absl.logging format.

    Then we needed to combine absl.flags with argparse, and used your solution in #27 (Let one parser parse "known flags", and the other parse the rest. Example 2) It works great except that we need to run main() instead of app.run(main) And all the logging were gone. So we tried to add absl.logging.use_absl_handler() in __init__.py following #148 Now we are able to see content from logger.xxx in absl.logging format, but not those from logging.xxx no matter it is from python logging or absl logging.

    Did I miss anything from app.run() or not using logging correctly?

    opened by unacao 5
  • Unexpected behavior when using absl-py with python's native logging library

    Unexpected behavior when using absl-py with python's native logging library

    I am seeing unexpected behaviors when using absl-py with a python library that uses python's native logging library.

    Here is a minimal reproduce script:

    from absl import app
    import logging
    
    
    def main(argv):
      logger = logging.getLogger('test_logger')
      logger.setLevel(logging.DEBUG)
      ch = logging.StreamHandler()
      ch.setLevel(logging.DEBUG)
      logger.addHandler(ch)
    
      logger.info('My test message.')
    
    
    if __name__ == '__main__':
      app.run(main)
    

    Here is the output from the above script:

    My test message.
    I0806 13:54:58.868444 140734895885760 python_test.py:11] My test message.
    

    The message is somehow duplicated, one with timestamp, and one without timestamp.

    I don't have control on the third_party python library (that uses python's native logging library), so I cannot switch that library to use absl-py logging.

    Is there anyway to fix or workaround the problem without updating the logging library in the third party python library?

    opened by kqyang 5
  • Accessing C++ flags from Python

    Accessing C++ flags from Python

    opened by jiawen 1
  • argparse_flags.ArgumentParser does not accept --flagfile if there are no flags

    argparse_flags.ArgumentParser does not accept --flagfile if there are no flags

    Minimum repro:

    # foo.py
    import absl.flags.argparse_flags
    import argparse
    # absl.flags.DEFINE_string("do_not_use_flagfile_hack", "", "") # A
    parser = absl.flags.argparse_flags.ArgumentParser()
    parser.add_argument("--foo")
    parser.parse_args()
    
    echo "--foo" > flags.txt
    foo.py --flagfile=flags.txt
    

    The error is:

    foo.py: error: unrecognized arguments: --flagfile=flags.txt
    

    The command would work if I uncomment line A.

    It appears that ArgumentParser only accepts --flagfile if there are some DEFINE_'d strings. This is because of this line:

    https://github.com/abseil/abseil-py/blob/main/absl/flags/argparse_flags.py#L156

        if self._inherited_absl_flags: # <---
          # Handle --flagfile.
          # Explicitly specify force_gnu=True, since argparse behaves like
          # gnu_getopt: flags can be specified after positional arguments.
          args = self._inherited_absl_flags.read_flags_from_files(
              args, force_gnu=True)
    

    --flagfile is only accepted if bool(self._inherited_absl_flags), which is False if there are no DEFINE_d strings.

    opened by jacky8hyf 1
  • absl.flags fails with multiprocessing when using

    absl.flags fails with multiprocessing when using "spawn"

    There's something odd going on with absl.flags and interacting very badly with multiprocessing when using 'spawn' as a start method. This is on MacOS 11.4, using homebrew's version of Python 3.9.6, although it also fails on the system python 3, 3.8.2.

    Given the following code (I'll also atttach it), multifail.py.txt

    """ import absl.flags import absl.app import multiprocessing import time

    absl.flags.DEFINE_integer("delay", 2, "sleep delay") FLAGS = absl.flags.FLAGS

    def worker(n): time.sleep(FLAGS.delay) print(n)

    def main(argv): # "fork" works fine. multiprocessing.set_start_method("spawn") with multiprocessing.Pool(20) as pool: pool.map(worker, range(1000))

    if name == "main": absl.app.run(main) """

    it will fail (inconsistently) with

    multiprocessing.pool.RemoteTraceback: """ Traceback (most recent call last): File "/opt/homebrew/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/pool.py", line 125, in worker result = (True, func(*args, **kwds)) File "/opt/homebrew/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/pool.py", line 48, in mapstar return list(map(*args)) File "/Users/anthonybaxter/multifail.py", line 10, in worker time.sleep(FLAGS.delay) File "/opt/homebrew/lib/python3.9/site-packages/absl/flags/_flagvalues.py", line 499, in getattr raise _exceptions.UnparsedFlagAccessError(error_message) absl.flags._exceptions.UnparsedFlagAccessError: Trying to access flag --delay before flags were parsed.

    The above exception was the direct cause of the following exception:

    Traceback (most recent call last): File "/Users/anthonybaxter/multifail.py", line 22, in absl.app.run(main) File "/opt/homebrew/lib/python3.9/site-packages/absl/app.py", line 312, in run _run_main(main, args) File "/opt/homebrew/lib/python3.9/site-packages/absl/app.py", line 258, in _run_main sys.exit(main(argv)) File "/Users/anthonybaxter/multifail.py", line 18, in main pool.map(worker, range(1000)) File "/opt/homebrew/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/pool.py", line 364, in map return self._map_async(func, iterable, mapstar, chunksize).get() File "/opt/homebrew/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/pool.py", line 771, in get raise self._value absl.flags._exceptions.UnparsedFlagAccessError: Trying to access flag --delay before flags were parsed. """

    opened by anthonybaxter 3
  • Abstract test case

    Abstract test case

    Sometimes we have some interface and we would like to write a generic test suite for it, so that concrete implementations just reuse it.

    The problem with Python's unittest (and transitively absltest) is that the TestCase class serves as a "marker" telling the test executor that it should be executed. This is unfortunate, because abstract test suites should not run. Consider this example:

    class FooTest(absltest.TestCase):
    
        @abstractmethod
        def new_foo(self) -> Foo:
            pass
    
        def test_bar(self) -> None:
            foo = self.new_foo()
            self.assertEqual(foo.bar(), "bar")
    
    
    class QuuxTest(FooTest):
    
        def new_foo(self) -> Foo:
            return Quux()
    
    
    class NorfTest(FooTest):
    
        def new_foo(self) -> Foo:
            return Norf()
    

    Here, the test executor will instantiate FooTest, QuuxTest and NorfTest. However, FooTest is abstract and it is not possible to create an instance of it. There are three workarounds for this that I am aware of.

    The first one is to configure the test executor to ignore specific test classes or prefixes (possible in pytest). However, this is awkward and requires modifying external configuration files.

    The second one is described here. Basically, we del the base class once child classes are defined. This feels very wrong and works only if all the concrete test cases are defined in the same module.

    The last one is to use a mixin approach. Instead of making FooTest derive from absltest.TestCase, we "mark" only concrete classes with it:

    class FooTest:
    
        @abstractmethod
        def new_foo(self) -> Foo:
            pass
    
        def test_bar(self) -> None:
            foo = self.new_foo()
            self.assertEqual(foo.bar(), "bar")
    
    
    class QuuxTest(FooTest, absltest.TestCase):
    
        def new_foo(self) -> Foo:
            return Quux()
    
    
    class NorfTest(FooTest, absltest.TestCase):
    
        def new_foo(self) -> Foo:
            return Norf()
    

    The problem here is that it doesn't work with static type checkers: FooTest now doesn't inherit from TestCase but uses methods like self.assertEqual.

    This last solution seems like the only "correct" one except for the mentioned issue. Instead, Abseil could define an abstract test class and make the normal test case class implement it:

    class AbstractTestCase(ABC):
    
        @abstractmethod
        def assertEqual(self, this, that):
          ...
    
        ...
    
    class TestCase(AbstractTestCase):
        ...
    

    Then, it would be possible to inherit from absltest.AbstractTestCase in the abstract test case, making the type checker happy:

    class FooTest(absltest.AbstractTestCase):
    
        @abstractmethod
        def new_foo(self) -> Foo:
            pass
    
        def test_bar(self) -> None:
            foo = self.new_foo()
            self.assertEqual(foo.bar(), "bar")
    
    
    class QuuxTest(FooTest, absltest.TestCase):
    
        def new_foo(self) -> Foo:
            return Quux()
    
    
    class NorfTest(FooTest, absltest.TestCase):
    
        def new_foo(self) -> Foo:
            return Norf()
    
    opened by panhania 6
  • Absl flags pathlib support

    Absl flags pathlib support

    Are there any plans to support a flags.DEFINE_path or something similar that utilizes python's pathlib module to support declaring os.PathLike operations for the default option?

    For context, I often find myself doing the following:

    from absl import app, flags
    from pathlib import Path
    
    FLAGS = flags.FLAGS
    flags.DEFINE_string("filepath", "path/to/some.txt", "Input filepath for program")
    
    def main(argv_):
        # Override FLAGS.filepath with a pathlib.Path version
        FLAGS.filepath = Path(FLAGS.filepath)
        
        # Rest of program uses pathlib for path operations
    
    if __name__ == "__main__":
        app.run(main)
    

    It would be awesome if there was an easy way to define a Path object from the DEFINE_ definition in the first place. If adding such a feature is not feasible, I'm curious how other people are using pathlib with absl.flags as well.

    Thanks!

    opened by bsarden 3
Releases(v1.3.0)
  • v1.3.0(Oct 13, 2022)

    Added

    • (flags) Added a new absl.flags.set_default function that updates the flag default for a provided FlagHolder. This parallels the absl.flags.FlagValues.set_default interface which takes a flag name.
    • (flags) The following functions now also accept FlagHolder instance(s) in addition to flag name(s) as their first positional argument:
      • flags.register_validator
      • flags.validator
      • flags.register_multi_flags_validator
      • flags.multi_flags_validator
      • flags.mark_flag_as_required
      • flags.mark_flags_as_required
      • flags.mark_flags_as_mutual_exclusive
      • flags.mark_bool_flags_as_mutual_exclusive
      • flags.declare_key_flag

    Changed

    • (testing) Assertions assertRaisesWithPredicateMatch and assertRaisesWithLiteralMatch now capture the raised Exception for further analysis when used as a context manager.
    • (testing) TextAndXMLTestRunner now produces time duration values with millisecond precision in XML test result output.
    • (flags) Keyword access to flag_name arguments in the following functions is deprecated. This parameter will be renamed in a future 2.0.0 release.
      • flags.register_validator
      • flags.validator
      • flags.register_multi_flags_validator
      • flags.multi_flags_validator
      • flags.mark_flag_as_required
      • flags.mark_flags_as_required
      • flags.mark_flags_as_mutual_exclusive
      • flags.mark_bool_flags_as_mutual_exclusive
      • flags.declare_key_flag
    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Jul 18, 2022)

  • v1.1.0(Jun 1, 2022)

    Changed

    • Flag instances now raise an error if used in a bool context. This prevents the occasional mistake of testing an instance for truthiness rather than testing flag.value.
    • absl-py no longer depends on six.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Nov 10, 2021)

    Changed

    • absl-py no longer supports Python 2.7, 3.4, 3.5. All versions have reached end-of-life for more than a year now.
    • New releases will be tagged as vX.Y.Z instead of pypi-vX.Y.Z in the git repo going forward.
    Source code(tar.gz)
    Source code(zip)
Owner
Abseil
Abseil
An html wrapper for python

MessySoup What is it? MessySoup is a python wrapper for html elements. While still a ways away, the main goal is to be able to build a wesbite straigh

4 Jan 05, 2022
run-js Goal: The Easiest Way to Run JavaScript in Python

run-js Goal: The Easiest Way to Run JavaScript in Python features Stateless Async JS Functions No Intermediary Files Functional Programming CommonJS a

Daniel J. Dufour 9 Aug 16, 2022
BDD base project: Python + Behave

BDD base project: Python + Behave Basic example of using Python with Behave (BDD). This Gherkin example includes: Basic Scenario Scenario Outline Tagg

eccanto 1 Dec 08, 2021
Python package for reference counting native pointers

refcount master: testing: This package is primarily for managing resources in native libraries, written for instance in C++, from Python. While it boi

CSIRO Hydroinformatics 2 Nov 03, 2022
Library for mocking AsyncIOMotorClient built on top of mongomock.

mongomock-motor Best effort mock for AsyncIOMotorClient (Database, Collection, e.t.c) built on top of mongomock library. Example / Showcase from mongo

Michael Kryukov 43 Jan 04, 2023
Adam with minor modifications which give significant improvement

BAdam Modification of Adam [1] optimizer with increased stability and better performance. Tricks used: Decoupled weight decay as in AdamW [2]. Such de

19 May 11, 2022
Solcast Integration for Home Assistant

Solcast Solar Home Assistant(https://www.home-assistant.io/) Component This custom component integrates the Solcast API into Home Assistant. Modified

Greg 45 Dec 20, 2022
3x+1 recreated in Python

3x-1 3x+1 recreated in Python If a number is odd it is multiplied by 3 and 1 is added to the product. If a number is even it is divided by 2. These ru

4 Aug 19, 2022
An almost fully customizable language made in python!

Whython is a project language, the idea of it is that anyone can download and edit the language to make it suitable to what they want.

Julian 47 Nov 05, 2022
This repo houses the qhub frontend moving forward.

This repo houses the qhub frontend moving forward. This effort will house a backend written in fastAPI, and a fronend in Vue, with additional components.

Quansight 1 Feb 10, 2021
Python dictionaries with advanced dot notation access

from box import Box movie_box = Box({ "Robin Hood: Men in Tights": { "imdb stars": 6.7, "length": 104 } }) movie_box.Robin_Hood_Men_in_Tights.imdb_s

Chris Griffith 2.1k Dec 28, 2022
Fixes your Microphone Level to one specific value.

MicLeveler Fixes your Microphone Level to one specific value. Intention A friend of mine has the problem that some programs are setting his microphone

Moritz Timpe 2 Oct 14, 2021
Esercizi di Python svolti per il biennio di Tecnologie Informatiche.

Esercizi di Python Un piccolo aiuto per Sofia che nel 2° quadrimestre inizierà Python :) Questo repository (termine tecnico di Git) puoi trovare tutti

Leonardo Essam Dei Rossi 2 Nov 07, 2022
Python implementation of the ASFLIP advection method

This is a python implementation of the ASFLIP advection method . We would like to hear from you if you appreciate this work.

Raymond Yun Fei 133 Nov 13, 2022
Modelling the 30 salamander problem from `Pure Mathematics` by Martin Liebeck

Salamanders on an island The Problem From A Concise Introduction to Pure Mathematics By Martin Liebeck Critic Ivor Smallbrain is watching the horror m

Faisal Jina 1 Jul 10, 2022
bamboo-engine 是一个通用的流程引擎,他可以解析,执行,调度由用户创建的流程任务,并提供了如暂停,撤销,跳过,强制失败,重试和重入等等灵活的控制能力和并行、子流程等进阶特性,并可通过水平扩展来进一步提升任务的并发处理能力。

bamboo-engine 是一个通用的流程引擎,他可以解析,执行,调度由用户创建的流程任务,并提供了如暂停,撤销,跳过,强制失败,重试和重入等等灵活的控制能力和并行、子流程等进阶特性,并可通过水平扩展来进一步提升任务的并发处理能力。 整体设计 Quick start 1. 安装依赖 2. 项目初始

腾讯蓝鲸 96 Dec 15, 2022
An open source recipe book from the awesome staff of Clinical Genomics

meatballs An open source recipe book from the awesome staff of Clinical Genomics.

Clinical Genomics 2 Dec 07, 2021
🗽 Like yarn outdated/upgrade, but for pip. Upgrade all your pip packages and automate your Python Dependency Management.

pipupgrade The missing command for pip Table of Contents Features Quick Start Usage Basic Usage Docker Environment Variables FAQ License Features Upda

Achilles Rasquinha 529 Dec 31, 2022
A program that analyzes data from inertia measurement units installeed in aircraft and generates g-exceedance curves

A program that analyzes data from inertia measurement units installeed in aircraft and generates g-exceedance curves

Pooya 1 Nov 23, 2021
Blender Add-on That Provides Quick Access to Render Controls

Blender Render Buttons Blender Add-on That Provides Quick Access to Render Controls A Blender 3.0 compatablity update of Blender2.8x-RenderButton v0.0

Don Schnitzius 3 Oct 18, 2022