aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorSemyon Moroz <donbarbos@proton.me>2025-03-17 13:36:30 +0400
committerGitHub <noreply@github.com>2025-03-17 09:36:30 +0000
commit85c04f80fd3a3098674f60038f248c076a476acf (patch)
treecfe41a4c636bdf90c75f831198262f91e7c0fcb0
parenta1aeec61c4321ba9a6966109343bd88dcf9cb26a (diff)
downloadcpython-85c04f80fd3a3098674f60038f248c076a476acf.tar.gz
cpython-85c04f80fd3a3098674f60038f248c076a476acf.zip
gh-93096: Update and document `pickletools` CLI (#131273)
-rw-r--r--Doc/library/pickletools.rst12
-rw-r--r--Lib/pickletools.py43
2 files changed, 28 insertions, 27 deletions
diff --git a/Doc/library/pickletools.rst b/Doc/library/pickletools.rst
index e072605974f..30fc2962e0b 100644
--- a/Doc/library/pickletools.rst
+++ b/Doc/library/pickletools.rst
@@ -19,7 +19,7 @@ ordinary users of the :mod:`pickle` module probably won't find the
.. _pickletools-cli:
-Command line usage
+Command-line usage
------------------
.. versionadded:: 3.2
@@ -48,7 +48,7 @@ For example, with a tuple ``(1, 2)`` pickled in file ``x.pickle``:
9: . STOP
highest protocol among opcodes = 2
-Command line options
+Command-line options
^^^^^^^^^^^^^^^^^^^^
.. program:: pickletools
@@ -72,12 +72,16 @@ Command line options
.. option:: -p, --preamble=<preamble>
- When more than one pickle file are specified, print given preamble
+ When more than one pickle file is specified, print given preamble
before each disassembly.
+.. option:: pickle_file
+ A pickle file to read, or ``-`` to indicate reading from standard input.
-Programmatic Interface
+
+
+Programmatic interface
----------------------
diff --git a/Lib/pickletools.py b/Lib/pickletools.py
index 02aad12985d..53f25ea4e46 100644
--- a/Lib/pickletools.py
+++ b/Lib/pickletools.py
@@ -2845,7 +2845,7 @@ if __name__ == "__main__":
description='disassemble one or more pickle files')
parser.add_argument(
'pickle_file',
- nargs='*', help='the pickle file')
+ nargs='+', help='the pickle file')
parser.add_argument(
'-o', '--output',
help='the file where the output should be written')
@@ -2863,26 +2863,23 @@ if __name__ == "__main__":
help='if more than one pickle file is specified, print this before'
' each disassembly')
args = parser.parse_args()
- if not args.pickle_file:
- parser.print_help()
+ annotate = 30 if args.annotate else 0
+ memo = {} if args.memo else None
+ if args.output is None:
+ output = sys.stdout
else:
- annotate = 30 if args.annotate else 0
- memo = {} if args.memo else None
- if args.output is None:
- output = sys.stdout
- else:
- output = open(args.output, 'w')
- try:
- for arg in args.pickle_file:
- if len(args.pickle_file) > 1:
- name = '<stdin>' if arg == '-' else arg
- preamble = args.preamble.format(name=name)
- output.write(preamble + '\n')
- if arg == '-':
- dis(sys.stdin.buffer, output, memo, args.indentlevel, annotate)
- else:
- with open(arg, 'rb') as f:
- dis(f, output, memo, args.indentlevel, annotate)
- finally:
- if output is not sys.stdout:
- output.close()
+ output = open(args.output, 'w')
+ try:
+ for arg in args.pickle_file:
+ if len(args.pickle_file) > 1:
+ name = '<stdin>' if arg == '-' else arg
+ preamble = args.preamble.format(name=name)
+ output.write(preamble + '\n')
+ if arg == '-':
+ dis(sys.stdin.buffer, output, memo, args.indentlevel, annotate)
+ else:
+ with open(arg, 'rb') as f:
+ dis(f, output, memo, args.indentlevel, annotate)
+ finally:
+ if output is not sys.stdout:
+ output.close()