{ "info": { "author": "tqdm developers", "author_email": "python.tqdm@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Environment :: MacOS X", "Environment :: Other Environment", "Environment :: Win32 (MS Windows)", "Environment :: X11 Applications", "Framework :: IPython", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: End Users/Desktop", "Intended Audience :: Other Audience", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Operating System :: POSIX :: BSD", "Operating System :: POSIX :: BSD :: FreeBSD", "Operating System :: POSIX :: Linux", "Operating System :: POSIX :: SunOS/Solaris", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation", "Programming Language :: Python :: Implementation :: IronPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Desktop Environment", "Topic :: Education :: Testing", "Topic :: Office/Business", "Topic :: Other/Nonlisted Topic", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: User Interfaces", "Topic :: System :: Logging", "Topic :: System :: Monitoring", "Topic :: System :: Shells", "Topic :: Terminals", "Topic :: Utilities" ], "description": "|Logo|\n\ntqdm\n====\n\n|PyPI-Status| |PyPI-Versions| |Conda-Forge-Status|\n\n|Build-Status| |Coverage-Status| |Branch-Coverage-Status| |Codacy-Grade|\n\n|DOI-URI| |LICENCE| |OpenHub-Status|\n\n\n``tqdm`` means \"progress\" in Arabic (taqadum, \u062a\u0642\u062f\u0651\u0645)\nand is an abbreviation for \"I love you so much\" in Spanish (te quiero demasiado).\n\nInstantly make your loops show a smart progress meter - just wrap any\niterable with ``tqdm(iterable)``, and you're done!\n\n.. code:: python\n\n from tqdm import tqdm\n for i in tqdm(range(10000)):\n ...\n\n``76%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | 7568/10000 [00:33<00:10, 229.00it/s]``\n\n``trange(N)`` can be also used as a convenient shortcut for\n``tqdm(xrange(N))``.\n\n|Screenshot|\n REPL: `ptpython `__\n\nIt can also be executed as a module with pipes:\n\n.. code:: sh\n\n $ seq 9999999 | tqdm --unit_scale | wc -l\n 10.0Mit [00:02, 3.58Mit/s]\n 9999999\n $ 7z a -bd -r backup.7z docs/ | grep Compressing | \\\n tqdm --total $(find docs/ -type f | wc -l) --unit files >> backup.log\n 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2589| 8014/8014 [01:37<00:00, 82.29files/s]\n\nOverhead is low -- about 60ns per iteration (80ns with ``tqdm_gui``), and is\nunit tested against performance regression.\nBy comparison, the well-established\n`ProgressBar `__ has\nan 800ns/iter overhead.\n\nIn addition to its low overhead, ``tqdm`` uses smart algorithms to predict\nthe remaining time and to skip unnecessary iteration displays, which allows\nfor a negligible overhead in most cases.\n\n``tqdm`` works on any platform\n(Linux, Windows, Mac, FreeBSD, NetBSD, Solaris/SunOS),\nin any console or in a GUI, and is also friendly with IPython/Jupyter notebooks.\n\n``tqdm`` does not require any dependencies (not even ``curses``!), just\nPython and an environment supporting ``carriage return \\r`` and\n``line feed \\n`` control characters.\n\n------------------------------------------\n\n.. contents:: Table of contents\n :backlinks: top\n :local:\n\n\nInstallation\n------------\n\nLatest PyPI stable release\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n|PyPI-Status|\n\n.. code:: sh\n\n pip install tqdm\n\nLatest development release on GitHub\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n|GitHub-Status| |GitHub-Stars| |GitHub-Commits| |GitHub-Forks|\n\nPull and install in the current directory:\n\n.. code:: sh\n\n pip install -e git+https://github.com/tqdm/tqdm.git@master#egg=tqdm\n\nLatest Conda release\n~~~~~~~~~~~~~~~~~~~~\n\n|Conda-Forge-Status|\n\n.. code:: sh\n\n conda install -c conda-forge tqdm\n\n\nChangelog\n---------\n\nThe list of all changes is available either on GitHub's Releases:\n|GitHub-Status|, on the\n`wiki `__ or on crawlers such as\n`allmychanges.com `_.\n\n\nUsage\n-----\n\n``tqdm`` is very versatile and can be used in a number of ways.\nThe three main ones are given below.\n\nIterable-based\n~~~~~~~~~~~~~~\n\nWrap ``tqdm()`` around any iterable:\n\n.. code:: python\n\n text = \"\"\n for char in tqdm([\"a\", \"b\", \"c\", \"d\"]):\n text = text + char\n\n``trange(i)`` is a special optimised instance of ``tqdm(range(i))``:\n\n.. code:: python\n\n for i in trange(100):\n pass\n\nInstantiation outside of the loop allows for manual control over ``tqdm()``:\n\n.. code:: python\n\n pbar = tqdm([\"a\", \"b\", \"c\", \"d\"])\n for char in pbar:\n pbar.set_description(\"Processing %s\" % char)\n\nManual\n~~~~~~\n\nManual control on ``tqdm()`` updates by using a ``with`` statement:\n\n.. code:: python\n\n with tqdm(total=100) as pbar:\n for i in range(10):\n pbar.update(10)\n\nIf the optional variable ``total`` (or an iterable with ``len()``) is\nprovided, predictive stats are displayed.\n\n``with`` is also optional (you can just assign ``tqdm()`` to a variable,\nbut in this case don't forget to ``del`` or ``close()`` at the end:\n\n.. code:: python\n\n pbar = tqdm(total=100)\n for i in range(10):\n pbar.update(10)\n pbar.close()\n\nModule\n~~~~~~\n\nPerhaps the most wonderful use of ``tqdm`` is in a script or on the command\nline. Simply inserting ``tqdm`` (or ``python -m tqdm``) between pipes will pass\nthrough all ``stdin`` to ``stdout`` while printing progress to ``stderr``.\n\nThe example below demonstrated counting the number of lines in all Python files\nin the current directory, with timing information included.\n\n.. code:: sh\n\n $ time find . -name '*.py' -exec cat \\{} \\; | wc -l\n 857365\n\n real 0m3.458s\n user 0m0.274s\n sys 0m3.325s\n\n $ time find . -name '*.py' -exec cat \\{} \\; | tqdm | wc -l\n 857366it [00:03, 246471.31it/s]\n 857365\n\n real 0m3.585s\n user 0m0.862s\n sys 0m3.358s\n\nNote that the usual arguments for ``tqdm`` can also be specified.\n\n.. code:: sh\n\n $ find . -name '*.py' -exec cat \\{} \\; |\n tqdm --unit loc --unit_scale --total 857366 >> /dev/null\n 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 857K/857K [00:04<00:00, 246Kloc/s]\n\nBacking up a large directory?\n\n.. code:: sh\n\n $ 7z a -bd -r backup.7z docs/ | grep Compressing |\n tqdm --total $(find docs/ -type f | wc -l) --unit files >> backup.log\n 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2589| 8014/8014 [01:37<00:00, 82.29files/s]\n\n\nFAQ and Known Issues\n--------------------\n\n|GitHub-Issues|\n\nThe most common issues relate to excessive output on multiple lines, instead\nof a neat one-line progress bar.\n\n- Consoles in general: require support for carriage return (``CR``, ``\\r``).\n- Nested progress bars:\n * Consoles in general: require support for moving cursors up to the\n previous line. For example,\n `IDLE `__,\n `ConEmu `__ and\n `PyCharm `__ (also\n `here `__,\n `here `__, and\n `here `__)\n lack full support.\n * Windows: additionally may require the Python module ``colorama``\n to ensure nested bars stay within their respective lines.\n- Unicode:\n * Environments which report that they support unicode will have solid smooth\n progressbars. The fallback is an `ascii`-only bar.\n * Windows consoles often only partially support unicode and thus\n `often require explicit ascii=True `__\n (also `here `__). This is due to\n either normal-width unicode characters being incorrectly displayed as\n \"wide\", or some unicode characters not rendering.\n- Wrapping enumerated iterables: use ``enumerate(tqdm(...))`` instead of\n ``tqdm(enumerate(...))``. The same applies to ``numpy.ndenumerate``.\n This is because enumerate functions tend to hide the length of iterables.\n ``tqdm`` does not.\n- Wrapping zipped iterables has similar issues due to internal optimisations.\n ``tqdm(zip(a, b))`` should be replaced with ``zip(tqdm(a), b)`` or even\n ``zip(tqdm(a), tqdm(b))``.\n\nIf you come across any other difficulties, browse and file |GitHub-Issues|.\n\nDocumentation\n-------------\n\n|PyPI-Versions| |README-Hits| (Since 19 May 2016)\n\n.. code:: python\n\n class tqdm(object):\n \"\"\"\n Decorate an iterable object, returning an iterator which acts exactly\n like the original iterable, but prints a dynamically updating\n progressbar every time a value is requested.\n \"\"\"\n\n def __init__(self, iterable=None, desc=None, total=None, leave=True,\n file=None, ncols=None, mininterval=0.1,\n maxinterval=10.0, miniters=None, ascii=None, disable=False,\n unit='it', unit_scale=False, dynamic_ncols=False,\n smoothing=0.3, bar_format=None, initial=0, position=None,\n postfix=None, unit_divisor=1000):\n\nParameters\n~~~~~~~~~~\n\n* iterable : iterable, optional \n Iterable to decorate with a progressbar.\n Leave blank to manually manage the updates.\n* desc : str, optional \n Prefix for the progressbar.\n* total : int, optional \n The number of expected iterations. If unspecified,\n len(iterable) is used if possible. As a last resort, only basic\n progress statistics are displayed (no ETA, no progressbar).\n If ``gui`` is True and this parameter needs subsequent updating,\n specify an initial arbitrary large positive integer,\n e.g. int(9e9).\n* leave : bool, optional \n If [default: True], keeps all traces of the progressbar\n upon termination of iteration.\n* file : ``io.TextIOWrapper`` or ``io.StringIO``, optional \n Specifies where to output the progress messages\n (default: sys.stderr). Uses ``file.write(str)`` and ``file.flush()``\n methods.\n* ncols : int, optional \n The width of the entire output message. If specified,\n dynamically resizes the progressbar to stay within this bound.\n If unspecified, attempts to use environment width. The\n fallback is a meter width of 10 and no limit for the counter and\n statistics. If 0, will not print any meter (only stats).\n* mininterval : float, optional \n Minimum progress display update interval [default: 0.1] seconds.\n* maxinterval : float, optional \n Maximum progress display update interval [default: 10] seconds.\n Automatically adjusts ``miniters`` to correspond to ``mininterval``\n after long display update lag. Only works if ``dynamic_miniters``\n or monitor thread is enabled.\n* miniters : int, optional \n Minimum progress display update interval, in iterations.\n If 0 and ``dynamic_miniters``, will automatically adjust to equal\n ``mininterval`` (more CPU efficient, good for tight loops).\n If > 0, will skip display of specified number of iterations.\n Tweak this and ``mininterval`` to get very efficient loops.\n If your progress is erratic with both fast and slow iterations\n (network, skipping items, etc) you should set miniters=1.\n* ascii : bool, optional \n If unspecified or False, use unicode (smooth blocks) to fill\n the meter. The fallback is to use ASCII characters ``1-9 #``.\n* disable : bool, optional \n Whether to disable the entire progressbar wrapper\n [default: False]. If set to None, disable on non-TTY.\n* unit : str, optional \n String that will be used to define the unit of each iteration\n [default: it].\n* unit_scale : bool or int or float, optional \n If 1 or True, the number of iterations will be reduced/scaled\n automatically and a metric prefix following the\n International System of Units standard will be added\n (kilo, mega, etc.) [default: False]. If any other non-zero\n number, will scale `total` and `n`.\n* dynamic_ncols : bool, optional \n If set, constantly alters ``ncols`` to the environment (allowing\n for window resizes) [default: False].\n* smoothing : float, optional \n Exponential moving average smoothing factor for speed estimates\n (ignored in GUI mode). Ranges from 0 (average speed) to 1\n (current/instantaneous speed) [default: 0.3].\n* bar_format : str, optional \n Specify a custom bar string formatting. May impact performance.\n [default: '{l_bar}{bar}{r_bar}'], where\n l_bar='{desc}: {percentage:3.0f}%|' and\n r_bar='| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, '\n '{rate_fmt}{postfix}]'\n Possible vars: l_bar, bar, r_bar, n, n_fmt, total, total_fmt,\n percentage, rate, rate_fmt, rate_noinv, rate_noinv_fmt,\n rate_inv, rate_inv_fmt, elapsed, remaining, desc, postfix.\n Note that a trailing \": \" is automatically removed after {desc}\n if the latter is empty.\n* initial : int, optional \n The initial counter value. Useful when restarting a progress\n bar [default: 0].\n* position : int, optional \n Specify the line offset to print this bar (starting from 0)\n Automatic if unspecified.\n Useful to manage multiple bars at once (eg, from threads).\n* postfix : dict or ``*``, optional \n Specify additional stats to display at the end of the bar.\n Calls ``set_postfix(**postfix)`` if possible (dict).\n* unit_divisor : float, optional \n [default: 1000], ignored unless `unit_scale` is True.\n\nExtra CLI Options\n~~~~~~~~~~~~~~~~~\n\n* delim : chr, optional \n Delimiting character [default: '\\n']. Use '\\0' for null.\n N.B.: on Windows systems, Python converts '\\n' to '\\r\\n'.\n* buf_size : int, optional \n String buffer size in bytes [default: 256]\n used when ``delim`` is specified.\n* bytes : bool, optional \n If true, will count bytes and ignore ``delim``.\n\nReturns\n~~~~~~~\n\n* out : decorated iterator.\n\n.. code:: python\n\n def update(self, n=1):\n \"\"\"\n Manually update the progress bar, useful for streams\n such as reading files.\n E.g.:\n >>> t = tqdm(total=filesize) # Initialise\n >>> for current_buffer in stream:\n ... ...\n ... t.update(len(current_buffer))\n >>> t.close()\n The last line is highly recommended, but possibly not necessary if\n ``t.update()`` will be called in such a way that ``filesize`` will be\n exactly reached and printed.\n\n Parameters\n ----------\n n : int, optional\n Increment to add to the internal counter of iterations\n [default: 1].\n \"\"\"\n\n def close(self):\n \"\"\"\n Cleanup and (if leave=False) close the progressbar.\n \"\"\"\n\n def unpause(self):\n \"\"\"\n Restart tqdm timer from last print time.\n \"\"\"\n\n def clear(self, nomove=False):\n \"\"\"\n Clear current bar display\n \"\"\"\n\n def refresh(self):\n \"\"\"\n Force refresh the display of this bar\n \"\"\"\n\n def write(cls, s, file=sys.stdout, end=\"\\n\"):\n \"\"\"\n Print a message via tqdm (without overlap with bars)\n \"\"\"\n\n def set_description(self, desc=None, refresh=True):\n \"\"\"\n Set/modify description of the progress bar.\n\n Parameters\n ----------\n desc : str, optional\n refresh : bool, optional\n Forces refresh [default: True].\n \"\"\"\n\n def set_postfix(self, ordered_dict=None, refresh=True, **kwargs):\n \"\"\"\n Set/modify postfix (additional stats)\n with automatic formatting based on datatype.\n\n Parameters\n ----------\n refresh : bool, optional\n Forces refresh [default: True].\n \"\"\"\n\n def trange(*args, **kwargs):\n \"\"\"\n A shortcut for tqdm(xrange(*args), **kwargs).\n On Python3+ range is used instead of xrange.\n \"\"\"\n\n class tqdm_gui(tqdm):\n \"\"\"\n Experimental GUI version of tqdm!\n \"\"\"\n\n def tgrange(*args, **kwargs):\n \"\"\"\n Experimental GUI version of trange!\n \"\"\"\n\n class tqdm_notebook(tqdm):\n \"\"\"\n Experimental IPython/Jupyter Notebook widget using tqdm!\n \"\"\"\n\n def tnrange(*args, **kwargs):\n \"\"\"\n Experimental IPython/Jupyter Notebook widget using tqdm!\n \"\"\"\n\n\nExamples and Advanced Usage\n---------------------------\n\n- See the `examples `__\n folder;\n- import the module and run ``help()``, or\n- consult the `wiki `__.\n - this has an\n `excellent article `__\n on how to make a **great** progressbar.\n\nDescription and additional stats\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCustom information can be displayed and updated dynamically on ``tqdm`` bars\nwith the ``desc`` and ``postfix`` arguments:\n\n.. code:: python\n\n from tqdm import trange\n from random import random, randint\n from time import sleep\n\n with trange(100) as t:\n for i in t:\n # Description will be displayed on the left\n t.set_description('GEN %i' % i)\n # Postfix will be displayed on the right,\n # formatted automatically based on argument's datatype\n t.set_postfix(loss=random(), gen=randint(1,999), str='h',\n lst=[1, 2])\n sleep(0.1)\n\n with tqdm(total=10, bar_format=\"{postfix[0]} {postfix[1][value]:>8.2g}\",\n postfix=[\"Batch\", dict(value=0)]) as t:\n for i in range(10):\n sleep(0.1)\n t.postfix[1][\"value\"] = i / 2\n t.update()\n\nPoints to remember when using ``{postfix[...]}`` in the ``bar_format`` string:\n\n- ``postfix`` also needs to be passed as an initial argument in a compatible\n format, and\n- ``postfix`` will be auto-converted to a string if it is a ``dict``-like\n object. To prevent this behaviour, insert an extra item into the dictionary\n where the key is not a string.\n\nNested progress bars\n~~~~~~~~~~~~~~~~~~~~\n\n``tqdm`` supports nested progress bars. Here's an example:\n\n.. code:: python\n\n from tqdm import trange\n from time import sleep\n\n for i in trange(10, desc='1st loop'):\n for j in trange(5, desc='2nd loop', leave=False):\n for k in trange(100, desc='3nd loop'):\n sleep(0.01)\n\nOn Windows `colorama `__ will be used if\navailable to keep nested bars on their respective lines.\n\nFor manual control over positioning (e.g. for multi-threaded use),\nyou may specify ``position=n`` where ``n=0`` for the outermost bar,\n``n=1`` for the next, and so on:\n\n.. code:: python\n\n from time import sleep\n from tqdm import trange, tqdm\n from multiprocessing import Pool, freeze_support, RLock\n\n L = list(range(9))\n\n def progresser(n):\n interval = 0.001 / (n + 2)\n total = 5000\n text = \"#{}, est. {:<04.2}s\".format(n, interval * total)\n for i in trange(total, desc=text, position=n):\n sleep(interval)\n\n if __name__ == '__main__':\n freeze_support() # for Windows support\n p = Pool(len(L),\n # again, for Windows support\n initializer=tqdm.set_lock, initargs=(RLock(),))\n p.map(progresser, L)\n print(\"\\n\" * (len(L) - 2))\n\nHooks and callbacks\n~~~~~~~~~~~~~~~~~~~\n\n``tqdm`` can easily support callbacks/hooks and manual updates.\nHere's an example with ``urllib``:\n\n**urllib.urlretrieve documentation**\n\n | [...]\n | If present, the hook function will be called once\n | on establishment of the network connection and once after each block read\n | thereafter. The hook will be passed three arguments; a count of blocks\n | transferred so far, a block size in bytes, and the total size of the file.\n | [...]\n\n.. code:: python\n\n import urllib, os\n from tqdm import tqdm\n\n class TqdmUpTo(tqdm):\n \"\"\"Provides `update_to(n)` which uses `tqdm.update(delta_n)`.\"\"\"\n def update_to(self, b=1, bsize=1, tsize=None):\n \"\"\"\n b : int, optional\n Number of blocks transferred so far [default: 1].\n bsize : int, optional\n Size of each block (in tqdm units) [default: 1].\n tsize : int, optional\n Total size (in tqdm units). If [default: None] remains unchanged.\n \"\"\"\n if tsize is not None:\n self.total = tsize\n self.update(b * bsize - self.n) # will also set self.n = b * bsize\n\n eg_link = \"https://caspersci.uk.to/matryoshka.zip\"\n with TqdmUpTo(unit='B', unit_scale=True, miniters=1,\n desc=eg_link.split('/')[-1]) as t: # all optional kwargs\n urllib.urlretrieve(eg_link, filename=os.devnull,\n reporthook=t.update_to, data=None)\n\nInspired by `twine#242 `__.\nFunctional alternative in\n`examples/tqdm_wget.py `__.\n\nIt is recommend to use ``miniters=1`` whenever there is potentially\nlarge differences in iteration speed (e.g. downloading a file over\na patchy connection).\n\nPandas Integration\n~~~~~~~~~~~~~~~~~~\n\nDue to popular demand we've added support for ``pandas`` -- here's an example\nfor ``DataFrame.progress_apply`` and ``DataFrameGroupBy.progress_apply``:\n\n.. code:: python\n\n import pandas as pd\n import numpy as np\n from tqdm import tqdm\n\n df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))\n\n # Register `pandas.progress_apply` and `pandas.Series.map_apply` with `tqdm`\n # (can use `tqdm_gui`, `tqdm_notebook`, optional kwargs, etc.)\n tqdm.pandas(desc=\"my bar!\")\n\n # Now you can use `progress_apply` instead of `apply`\n # and `progress_map` instead of `map`\n df.progress_apply(lambda x: x**2)\n # can also groupby:\n # df.groupby(0).progress_apply(lambda x: x**2)\n\nIn case you're interested in how this works (and how to modify it for your\nown callbacks), see the\n`examples `__\nfolder or import the module and run ``help()``.\n\nIPython/Jupyter Integration\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIPython/Jupyter is supported via the ``tqdm_notebook`` submodule:\n\n.. code:: python\n\n from tqdm import tnrange, tqdm_notebook\n from time import sleep\n\n for i in tnrange(10, desc='1st loop'):\n for j in tqdm_notebook(xrange(100), desc='2nd loop'):\n sleep(0.01)\n\nIn addition to ``tqdm`` features, the submodule provides a native Jupyter\nwidget (compatible with IPython v1-v4 and Jupyter), fully working nested bars\nand color hints (blue: normal, green: completed, red: error/interrupt,\nlight blue: no ETA); as demonstrated below.\n\n|Screenshot-Jupyter1|\n|Screenshot-Jupyter2|\n|Screenshot-Jupyter3|\n\nIt is also possible to let ``tqdm`` automatically choose between\nconsole or notebook versions by using the ``autonotebook`` submodule:\n\n.. code:: python\n\n from tqdm.autonotebook import tqdm\n tqdm.pandas()\n\nNote that this will issue a ``TqdmExperimentalWarning`` if run in a notebook\nsince it is not meant to be possible to distinguish between ``jupyter notebook``\nand ``jupyter console``. Use ``auto`` instead of ``autonotebook`` to suppress\nthis warning.\n\nWriting messages\n~~~~~~~~~~~~~~~~\n\nSince ``tqdm`` uses a simple printing mechanism to display progress bars,\nyou should not write any message in the terminal using ``print()`` while\na progressbar is open.\n\nTo write messages in the terminal without any collision with ``tqdm`` bar\ndisplay, a ``.write()`` method is provided:\n\n.. code:: python\n\n from tqdm import tqdm, trange\n from time import sleep\n\n bar = trange(10)\n for i in bar:\n # Print using tqdm class method .write()\n sleep(0.1)\n if not (i % 3):\n tqdm.write(\"Done task %i\" % i)\n # Can also use bar.write()\n\nBy default, this will print to standard output ``sys.stdout``. but you can\nspecify any file-like object using the ``file`` argument. For example, this\ncan be used to redirect the messages writing to a log file or class.\n\nRedirecting writing\n~~~~~~~~~~~~~~~~~~~\n\nIf using a library that can print messages to the console, editing the library\nby replacing ``print()`` with ``tqdm.write()`` may not be desirable.\nIn that case, redirecting ``sys.stdout`` to ``tqdm.write()`` is an option.\n\nTo redirect ``sys.stdout``, create a file-like class that will write\nany input string to ``tqdm.write()``, and supply the arguments\n``file=sys.stdout, dynamic_ncols=True``.\n\nA reusable canonical example is given below:\n\n.. code:: python\n\n from time import sleep\n import contextlib\n import sys\n from tqdm import tqdm\n\n class DummyTqdmFile(object):\n \"\"\"Dummy file-like that will write to tqdm\"\"\"\n file = None\n def __init__(self, file):\n self.file = file\n\n def write(self, x):\n # Avoid print() second call (useless \\n)\n if len(x.rstrip()) > 0:\n tqdm.write(x, file=self.file)\n\n def flush(self):\n return getattr(self.file, \"flush\", lambda: None)()\n\n @contextlib.contextmanager\n def std_out_err_redirect_tqdm():\n orig_out_err = sys.stdout, sys.stderr\n try:\n sys.stdout, sys.stderr = map(DummyTqdmFile, orig_out_err)\n yield orig_out_err[0]\n # Relay exceptions\n except Exception as exc:\n raise exc\n # Always restore sys.stdout/err if necessary\n finally:\n sys.stdout, sys.stderr = orig_out_err\n\n def some_fun(i):\n print(\"Fee, fi, fo,\".split()[i])\n\n # Redirect stdout to tqdm.write() (don't forget the `as save_stdout`)\n with std_out_err_redirect_tqdm() as orig_stdout:\n # tqdm needs the original stdout\n # and dynamic_ncols=True to autodetect console width\n for i in tqdm(range(3), file=orig_stdout, dynamic_ncols=True):\n sleep(.5)\n some_fun(i)\n\n # After the `with`, printing is restored\n print(\"Done!\")\n\nMonitoring thread, intervals and miniters\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``tqdm`` implements a few tricks to to increase efficiency and reduce overhead.\n\n- Avoid unnecessary frequent bar refreshing: ``mininterval`` defines how long\n to wait between each refresh. ``tqdm`` always gets updated in the background,\n but it will diplay only every ``mininterval``.\n- Reduce number of calls to check system clock/time.\n- ``mininterval`` is more intuitive to configure than ``miniters``.\n A clever adjustment system ``dynamic_miniters`` will automatically adjust\n ``miniters`` to the amount of iterations that fit into time ``mininterval``.\n Essentially, ``tqdm`` will check if it's time to print without actually\n checking time. This behaviour can be still be bypassed by manually setting\n ``miniters``.\n\nHowever, consider a case with a combination of fast and slow iterations.\nAfter a few fast iterations, ``dynamic_miniters`` will set ``miniters`` to a\nlarge number. When iteration rate subsequently slows, ``miniters`` will\nremain large and thus reduce display update frequency. To address this:\n\n- ``maxinterval`` defines the maximum time between display refreshes.\n A concurrent monitoring thread checks for overdue updates and forces one\n where necessary.\n\nThe monitoring thread should not have a noticeable overhead, and guarantees\nupdates at least every 10 seconds by default.\nThis value can be directly changed by setting the ``monitor_interval`` of\nany ``tqdm`` instance (i.e. ``t = tqdm.tqdm(...); t.monitor_interval = 2``).\nThe monitor thread may be disabled application-wide by setting\n``tqdm.tqdm.monitor_interval = 0`` before instantiatiation of any ``tqdm`` bar.\n\n\nContributions\n-------------\n\n|GitHub-Commits| |GitHub-Issues| |GitHub-PRs| |OpenHub-Status|\n\nAll source code is hosted on `GitHub `__.\nContributions are welcome.\n\nSee the\n`CONTRIBUTING `__\nfile for more information.\n\nPorts to Other Languages\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nA list is available on\n`this wiki page `__.\n\n\nLICENCE\n-------\n\nOpen Source (OSI approved): |LICENCE|\n\nCitation information: |DOI-URI|\n\n\nAuthors\n-------\n\nThe main developers, ranked by surviving lines of code\n(`git fame -wMC `__), are:\n\n- Casper da Costa-Luis (`casperdcl `__, ~2/3, |Gift-Casper|)\n- Stephen Larroque (`lrq3000 `__, ~1/5)\n- Hadrien Mary (`hadim `__, ~2%)\n- Guangshuo Chen (`chengs `__, ~1%)\n- Noam Yorav-Raphael (`noamraph `__, ~1%, original author)\n- Mikhail Korobov (`kmike `__, ~1%)\n\nThere are also many |GitHub-Contributions| which we are grateful for.\n\n|README-Hits| (Since 19 May 2016)\n\n.. |Logo| image:: https://raw.githubusercontent.com/tqdm/tqdm/master/images/logo.gif\n.. |Screenshot| image:: https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm.gif\n.. |Build-Status| image:: https://travis-ci.org/tqdm/tqdm.svg?branch=master\n :target: https://travis-ci.org/tqdm/tqdm\n.. |Coverage-Status| image:: https://coveralls.io/repos/tqdm/tqdm/badge.svg?branch=master\n :target: https://coveralls.io/github/tqdm/tqdm\n.. |Branch-Coverage-Status| image:: https://codecov.io/gh/tqdm/tqdm/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/tqdm/tqdm\n.. |Codacy-Grade| image:: https://api.codacy.com/project/badge/Grade/3f965571598f44549c7818f29cdcf177\n :target: https://www.codacy.com/app/tqdm/tqdm?utm_source=github.com&utm_medium=referral&utm_content=tqdm/tqdm&utm_campaign=Badge_Grade\n.. |GitHub-Status| image:: https://img.shields.io/github/tag/tqdm/tqdm.svg?maxAge=86400\n :target: https://github.com/tqdm/tqdm/releases\n.. |GitHub-Forks| image:: https://img.shields.io/github/forks/tqdm/tqdm.svg\n :target: https://github.com/tqdm/tqdm/network\n.. |GitHub-Stars| image:: https://img.shields.io/github/stars/tqdm/tqdm.svg\n :target: https://github.com/tqdm/tqdm/stargazers\n.. |GitHub-Commits| image:: https://img.shields.io/github/commit-activity/y/tqdm/tqdm.svg\n :target: https://github.com/tqdm/tqdm/graphs/commit-activity\n.. |GitHub-Issues| image:: https://img.shields.io/github/issues-closed/tqdm/tqdm.svg\n :target: https://github.com/tqdm/tqdm/issues\n.. |GitHub-PRs| image:: https://img.shields.io/github/issues-pr-closed/tqdm/tqdm.svg\n :target: https://github.com/tqdm/tqdm/pulls\n.. |GitHub-Contributions| image:: https://img.shields.io/github/contributors/tqdm/tqdm.svg\n :target: https://github.com/tqdm/tqdm/graphs/contributors\n.. |Gift-Casper| image:: https://img.shields.io/badge/gift-donate-ff69b4.svg\n :target: https://caspersci.uk.to/donate.html\n.. |PyPI-Status| image:: https://img.shields.io/pypi/v/tqdm.svg\n :target: https://pypi.org/project/tqdm\n.. |PyPI-Downloads| image:: https://img.shields.io/pypi/dm/tqdm.svg\n :target: https://pypi.org/project/tqdm\n.. |PyPI-Versions| image:: https://img.shields.io/pypi/pyversions/tqdm.svg\n :target: https://pypi.org/project/tqdm\n.. |Conda-Forge-Status| image:: https://anaconda.org/conda-forge/tqdm/badges/version.svg\n :target: https://anaconda.org/conda-forge/tqdm\n.. |OpenHub-Status| image:: https://www.openhub.net/p/tqdm/widgets/project_thin_badge?format=gif\n :target: https://www.openhub.net/p/tqdm?ref=Thin+badge\n.. |LICENCE| image:: https://img.shields.io/pypi/l/tqdm.svg\n :target: https://raw.githubusercontent.com/tqdm/tqdm/master/LICENCE\n.. |DOI-URI| image:: https://zenodo.org/badge/21637/tqdm/tqdm.svg\n :target: https://zenodo.org/badge/latestdoi/21637/tqdm/tqdm\n.. |Screenshot-Jupyter1| image:: https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-1.gif\n.. |Screenshot-Jupyter2| image:: https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-2.gif\n.. |Screenshot-Jupyter3| image:: https://raw.githubusercontent.com/tqdm/tqdm/master/images/tqdm-jupyter-3.gif\n.. |README-Hits| image:: https://caspersci.uk.to/cgi-bin/hits.cgi?q=tqdm&style=social&r=https://github.com/tqdm/tqdm&l=https://caspersci.uk.to/images/tqdm.png&f=https://raw.githubusercontent.com/tqdm/tqdm/master/images/logo.gif\n :target: https://caspersci.uk.to/cgi-bin/hits.cgi?q=tqdm&a=plot&r=https://github.com/tqdm/tqdm&l=https://caspersci.uk.to/images/tqdm.png&f=https://raw.githubusercontent.com/tqdm/tqdm/master/images/logo.gif&style=social", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/tqdm/tqdm", "keywords": "progressbar progressmeter progress bar meter rate eta console terminal time", "license": "MPLv2.0, MIT Licences", "maintainer": "", "maintainer_email": "", "name": "tqdm-conan", "package_url": "https://pypi.org/project/tqdm-conan/", "platform": "any", "project_url": "https://pypi.org/project/tqdm-conan/", "project_urls": { "Homepage": "https://github.com/tqdm/tqdm" }, "release_url": "https://pypi.org/project/tqdm-conan/4.27.0/", "requires_dist": null, "requires_python": ">=2.6, !=3.0.*, !=3.1.*", "summary": "Temporary fork of tqdmFast, Extensible Progress Meter", "version": "4.27.0" }, "last_serial": 4390409, "releases": { "4.27.0": [ { "comment_text": "", "digests": { "md5": "85582fe3a9f4ffd81d3a134414247d7f", "sha256": "6e310a3f074633de7517feceec0b1be6d0ae813d7f7b8d2c4a25ae67d5a37d39" }, "downloads": -1, "filename": "tqdm_conan-4.27.0.tar.gz", "has_sig": false, "md5_digest": "85582fe3a9f4ffd81d3a134414247d7f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6, !=3.0.*, !=3.1.*", "size": 102277, "upload_time": "2018-10-18T13:49:59", "url": "https://files.pythonhosted.org/packages/72/c7/17fbcf030b73d0a21254bb1ba6ae4e795f55ab60d2a3b5eeec05442592e0/tqdm_conan-4.27.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "85582fe3a9f4ffd81d3a134414247d7f", "sha256": "6e310a3f074633de7517feceec0b1be6d0ae813d7f7b8d2c4a25ae67d5a37d39" }, "downloads": -1, "filename": "tqdm_conan-4.27.0.tar.gz", "has_sig": false, "md5_digest": "85582fe3a9f4ffd81d3a134414247d7f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6, !=3.0.*, !=3.1.*", "size": 102277, "upload_time": "2018-10-18T13:49:59", "url": "https://files.pythonhosted.org/packages/72/c7/17fbcf030b73d0a21254bb1ba6ae4e795f55ab60d2a3b5eeec05442592e0/tqdm_conan-4.27.0.tar.gz" } ] }