diff --git a/Doc/library/cmdline.rst b/Doc/library/cmdline.rst index a000eb21845bac..25abee81e72a73 100644 --- a/Doc/library/cmdline.rst +++ b/Doc/library/cmdline.rst @@ -25,7 +25,7 @@ The following modules have a command-line interface. * :ref:`json ` * :ref:`mimetypes ` * :mod:`pdb` -* :mod:`pickle` +* :ref:`pickle ` * :ref:`pickletools ` * :mod:`platform` * :mod:`poplib` diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index 66aa51ceb84683..007c9fe1b950cf 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -1210,6 +1210,30 @@ The following example reads the resulting pickled data. :: .. pickletools.optimize() or the gzip module). +.. _pickle-cli: + +Command-line interface +---------------------- + +The :mod:`pickle` module can be invoked as a script from the command line, +it will display contents of the pickle files. However, when the pickle file +that you want to examine comes from an untrusted source, ``-m pickletools`` +is a safer option because it does not execute pickle bytecode, see +:ref:`pickletools CLI usage `. + +.. code-block:: bash + + python -m pickle pickle_file [pickle_file ...] + +The following option is accepted: + +.. program:: pickle + +.. option:: pickle_file + + A pickle file to read, or ``-`` to indicate reading from standard input. + + .. seealso:: Module :mod:`copyreg` diff --git a/Lib/pickle.py b/Lib/pickle.py index 8f7406d2534f2c..efcdcbec718166 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -1909,20 +1909,17 @@ def _loads(s, /, *, fix_imports=True, encoding="ASCII", errors="strict", if __name__ == "__main__": import argparse + import pprint parser = argparse.ArgumentParser( description='display contents of the pickle files') parser.add_argument( 'pickle_file', - nargs='*', help='the pickle file') + nargs='+', help='the pickle file') args = parser.parse_args() - if not args.pickle_file: - parser.print_help() - else: - import pprint - for fn in args.pickle_file: - if fn == '-': - obj = load(sys.stdin.buffer) - else: - with open(fn, 'rb') as f: - obj = load(f) - pprint.pprint(obj) + for fn in args.pickle_file: + if fn == '-': + obj = load(sys.stdin.buffer) + else: + with open(fn, 'rb') as f: + obj = load(f) + pprint.pprint(obj)