@rowstile/cli-win32-x64 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +5 -0
- package/package.json +23 -0
- package/python/DLLs/_asyncio.pyd +0 -0
- package/python/DLLs/_bz2.pyd +0 -0
- package/python/DLLs/_ctypes.pyd +0 -0
- package/python/DLLs/_ctypes_test.pyd +0 -0
- package/python/DLLs/_decimal.pyd +0 -0
- package/python/DLLs/_elementtree.pyd +0 -0
- package/python/DLLs/_hashlib.pyd +0 -0
- package/python/DLLs/_lzma.pyd +0 -0
- package/python/DLLs/_multiprocessing.pyd +0 -0
- package/python/DLLs/_overlapped.pyd +0 -0
- package/python/DLLs/_queue.pyd +0 -0
- package/python/DLLs/_socket.pyd +0 -0
- package/python/DLLs/_sqlite3.pyd +0 -0
- package/python/DLLs/_ssl.pyd +0 -0
- package/python/DLLs/_testbuffer.pyd +0 -0
- package/python/DLLs/_testcapi.pyd +0 -0
- package/python/DLLs/_testclinic.pyd +0 -0
- package/python/DLLs/_testclinic_limited.pyd +0 -0
- package/python/DLLs/_testconsole.pyd +0 -0
- package/python/DLLs/_testimportmultiple.pyd +0 -0
- package/python/DLLs/_testinternalcapi.pyd +0 -0
- package/python/DLLs/_testlimitedcapi.pyd +0 -0
- package/python/DLLs/_testmultiphase.pyd +0 -0
- package/python/DLLs/_testsinglephase.pyd +0 -0
- package/python/DLLs/_uuid.pyd +0 -0
- package/python/DLLs/_wmi.pyd +0 -0
- package/python/DLLs/_zoneinfo.pyd +0 -0
- package/python/DLLs/libcrypto-3-x64.dll +0 -0
- package/python/DLLs/libffi-8.dll +0 -0
- package/python/DLLs/libssl-3-x64.dll +0 -0
- package/python/DLLs/pyexpat.pyd +0 -0
- package/python/DLLs/select.pyd +0 -0
- package/python/DLLs/sqlite3.dll +0 -0
- package/python/DLLs/unicodedata.pyd +0 -0
- package/python/DLLs/winsound.pyd +0 -0
- package/python/DLLs/zlib1.dll +0 -0
- package/python/LICENSE.txt +445 -0
- package/python/Lib/__future__.py +147 -0
- package/python/Lib/__hello__.py +16 -0
- package/python/Lib/__pycache__/__future__.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_colorize.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_compat_pickle.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_compression.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_markupbase.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_opcode_metadata.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/_weakrefset.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ast.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/base64.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/bisect.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/bz2.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/calendar.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/colorsys.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/compileall.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/configparser.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/contextlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/copy.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/copyreg.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/csv.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/dataclasses.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/datetime.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/decimal.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/dis.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/enum.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/filecmp.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/fnmatch.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/fractions.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/functools.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/getpass.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/gettext.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/glob.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/gzip.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/hashlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/heapq.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/hmac.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/inspect.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ipaddress.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/keyword.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/linecache.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/locale.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/lzma.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/mimetypes.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/nturl2path.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/numbers.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/opcode.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/operator.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/optparse.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/pickle.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/pkgutil.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/platform.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/py_compile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/queue.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/quopri.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/random.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/reprlib.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/selectors.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/shlex.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/shutil.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/signal.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/socket.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/socketserver.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/ssl.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/string.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/stringprep.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/struct.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/subprocess.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tarfile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tempfile.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/textwrap.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/threading.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/token.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/tokenize.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/traceback.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/types.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/typing.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/uuid.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/warnings.cpython-313.pyc +0 -0
- package/python/Lib/__pycache__/weakref.cpython-313.pyc +0 -0
- package/python/Lib/_aix_support.py +108 -0
- package/python/Lib/_android_support.py +192 -0
- package/python/Lib/_apple_support.py +66 -0
- package/python/Lib/_collections_abc.py +1187 -0
- package/python/Lib/_colorize.py +119 -0
- package/python/Lib/_compat_pickle.py +251 -0
- package/python/Lib/_compression.py +162 -0
- package/python/Lib/_ios_support.py +71 -0
- package/python/Lib/_markupbase.py +396 -0
- package/python/Lib/_opcode_metadata.py +343 -0
- package/python/Lib/_osx_support.py +579 -0
- package/python/Lib/_py_abc.py +147 -0
- package/python/Lib/_pydatetime.py +2640 -0
- package/python/Lib/_pydecimal.py +6356 -0
- package/python/Lib/_pyio.py +2714 -0
- package/python/Lib/_pylong.py +363 -0
- package/python/Lib/_pyrepl/__init__.py +19 -0
- package/python/Lib/_pyrepl/__main__.py +10 -0
- package/python/Lib/_pyrepl/_minimal_curses.py +68 -0
- package/python/Lib/_pyrepl/_threading_handler.py +74 -0
- package/python/Lib/_pyrepl/base_eventqueue.py +110 -0
- package/python/Lib/_pyrepl/commands.py +492 -0
- package/python/Lib/_pyrepl/completing_reader.py +295 -0
- package/python/Lib/_pyrepl/console.py +229 -0
- package/python/Lib/_pyrepl/curses.py +33 -0
- package/python/Lib/_pyrepl/fancy_termios.py +82 -0
- package/python/Lib/_pyrepl/historical_reader.py +419 -0
- package/python/Lib/_pyrepl/input.py +114 -0
- package/python/Lib/_pyrepl/keymap.py +213 -0
- package/python/Lib/_pyrepl/main.py +59 -0
- package/python/Lib/_pyrepl/mypy.ini +29 -0
- package/python/Lib/_pyrepl/pager.py +175 -0
- package/python/Lib/_pyrepl/reader.py +764 -0
- package/python/Lib/_pyrepl/readline.py +599 -0
- package/python/Lib/_pyrepl/simple_interact.py +180 -0
- package/python/Lib/_pyrepl/trace.py +21 -0
- package/python/Lib/_pyrepl/types.py +10 -0
- package/python/Lib/_pyrepl/unix_console.py +852 -0
- package/python/Lib/_pyrepl/unix_eventqueue.py +76 -0
- package/python/Lib/_pyrepl/utils.py +83 -0
- package/python/Lib/_pyrepl/windows_console.py +687 -0
- package/python/Lib/_pyrepl/windows_eventqueue.py +42 -0
- package/python/Lib/_sitebuiltins.py +91 -0
- package/python/Lib/_strptime.py +800 -0
- package/python/Lib/_threading_local.py +120 -0
- package/python/Lib/_weakrefset.py +205 -0
- package/python/Lib/abc.py +188 -0
- package/python/Lib/antigravity.py +17 -0
- package/python/Lib/argparse.py +2690 -0
- package/python/Lib/ast.py +1865 -0
- package/python/Lib/asyncio/__init__.py +47 -0
- package/python/Lib/asyncio/__main__.py +211 -0
- package/python/Lib/asyncio/base_events.py +2086 -0
- package/python/Lib/asyncio/base_futures.py +67 -0
- package/python/Lib/asyncio/base_subprocess.py +312 -0
- package/python/Lib/asyncio/base_tasks.py +94 -0
- package/python/Lib/asyncio/constants.py +41 -0
- package/python/Lib/asyncio/coroutines.py +109 -0
- package/python/Lib/asyncio/events.py +885 -0
- package/python/Lib/asyncio/exceptions.py +62 -0
- package/python/Lib/asyncio/format_helpers.py +84 -0
- package/python/Lib/asyncio/futures.py +425 -0
- package/python/Lib/asyncio/locks.py +617 -0
- package/python/Lib/asyncio/log.py +7 -0
- package/python/Lib/asyncio/mixins.py +21 -0
- package/python/Lib/asyncio/proactor_events.py +891 -0
- package/python/Lib/asyncio/protocols.py +216 -0
- package/python/Lib/asyncio/queues.py +309 -0
- package/python/Lib/asyncio/runners.py +217 -0
- package/python/Lib/asyncio/selector_events.py +1328 -0
- package/python/Lib/asyncio/sslproto.py +929 -0
- package/python/Lib/asyncio/staggered.py +174 -0
- package/python/Lib/asyncio/streams.py +787 -0
- package/python/Lib/asyncio/subprocess.py +229 -0
- package/python/Lib/asyncio/taskgroups.py +278 -0
- package/python/Lib/asyncio/tasks.py +1121 -0
- package/python/Lib/asyncio/threads.py +26 -0
- package/python/Lib/asyncio/timeouts.py +185 -0
- package/python/Lib/asyncio/transports.py +337 -0
- package/python/Lib/asyncio/trsock.py +98 -0
- package/python/Lib/asyncio/unix_events.py +1550 -0
- package/python/Lib/asyncio/windows_events.py +906 -0
- package/python/Lib/asyncio/windows_utils.py +181 -0
- package/python/Lib/base64.py +628 -0
- package/python/Lib/bdb.py +973 -0
- package/python/Lib/bisect.py +118 -0
- package/python/Lib/bz2.py +352 -0
- package/python/Lib/cProfile.py +197 -0
- package/python/Lib/calendar.py +813 -0
- package/python/Lib/cmd.py +409 -0
- package/python/Lib/code.py +386 -0
- package/python/Lib/codecs.py +1132 -0
- package/python/Lib/codeop.py +155 -0
- package/python/Lib/collections/__init__.py +1603 -0
- package/python/Lib/collections/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/colorsys.py +166 -0
- package/python/Lib/compileall.py +470 -0
- package/python/Lib/concurrent/__init__.py +1 -0
- package/python/Lib/concurrent/futures/__init__.py +54 -0
- package/python/Lib/concurrent/futures/_base.py +660 -0
- package/python/Lib/concurrent/futures/process.py +892 -0
- package/python/Lib/concurrent/futures/thread.py +240 -0
- package/python/Lib/configparser.py +1396 -0
- package/python/Lib/contextlib.py +814 -0
- package/python/Lib/contextvars.py +4 -0
- package/python/Lib/copy.py +306 -0
- package/python/Lib/copyreg.py +217 -0
- package/python/Lib/csv.py +527 -0
- package/python/Lib/ctypes/__init__.py +602 -0
- package/python/Lib/ctypes/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/__pycache__/_endian.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/__pycache__/wintypes.cpython-313.pyc +0 -0
- package/python/Lib/ctypes/_aix.py +327 -0
- package/python/Lib/ctypes/_endian.py +78 -0
- package/python/Lib/ctypes/macholib/README.ctypes +7 -0
- package/python/Lib/ctypes/macholib/__init__.py +9 -0
- package/python/Lib/ctypes/macholib/dyld.py +165 -0
- package/python/Lib/ctypes/macholib/dylib.py +42 -0
- package/python/Lib/ctypes/macholib/fetch_macholib +2 -0
- package/python/Lib/ctypes/macholib/fetch_macholib.bat +1 -0
- package/python/Lib/ctypes/macholib/framework.py +42 -0
- package/python/Lib/ctypes/util.py +387 -0
- package/python/Lib/ctypes/wintypes.py +202 -0
- package/python/Lib/curses/__init__.py +101 -0
- package/python/Lib/curses/ascii.py +99 -0
- package/python/Lib/curses/has_key.py +192 -0
- package/python/Lib/curses/panel.py +6 -0
- package/python/Lib/curses/textpad.py +236 -0
- package/python/Lib/dataclasses.py +1679 -0
- package/python/Lib/datetime.py +9 -0
- package/python/Lib/dbm/__init__.py +194 -0
- package/python/Lib/dbm/dumb.py +319 -0
- package/python/Lib/dbm/gnu.py +3 -0
- package/python/Lib/dbm/ndbm.py +3 -0
- package/python/Lib/dbm/sqlite3.py +144 -0
- package/python/Lib/decimal.py +109 -0
- package/python/Lib/difflib.py +2058 -0
- package/python/Lib/dis.py +1075 -0
- package/python/Lib/doctest.py +2919 -0
- package/python/Lib/email/__init__.py +61 -0
- package/python/Lib/email/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_encoded_words.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_parseaddr.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/_policybase.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/base64mime.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/charset.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/encoders.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/errors.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/feedparser.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/header.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/iterators.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/message.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/parser.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/quoprimime.cpython-313.pyc +0 -0
- package/python/Lib/email/__pycache__/utils.cpython-313.pyc +0 -0
- package/python/Lib/email/_encoded_words.py +233 -0
- package/python/Lib/email/_header_value_parser.py +3153 -0
- package/python/Lib/email/_parseaddr.py +563 -0
- package/python/Lib/email/_policybase.py +382 -0
- package/python/Lib/email/architecture.rst +216 -0
- package/python/Lib/email/base64mime.py +115 -0
- package/python/Lib/email/charset.py +396 -0
- package/python/Lib/email/contentmanager.py +254 -0
- package/python/Lib/email/encoders.py +65 -0
- package/python/Lib/email/errors.py +117 -0
- package/python/Lib/email/feedparser.py +536 -0
- package/python/Lib/email/generator.py +530 -0
- package/python/Lib/email/header.py +582 -0
- package/python/Lib/email/headerregistry.py +618 -0
- package/python/Lib/email/iterators.py +68 -0
- package/python/Lib/email/message.py +1217 -0
- package/python/Lib/email/mime/__init__.py +0 -0
- package/python/Lib/email/mime/application.py +37 -0
- package/python/Lib/email/mime/audio.py +97 -0
- package/python/Lib/email/mime/base.py +29 -0
- package/python/Lib/email/mime/image.py +152 -0
- package/python/Lib/email/mime/message.py +33 -0
- package/python/Lib/email/mime/multipart.py +47 -0
- package/python/Lib/email/mime/nonmultipart.py +21 -0
- package/python/Lib/email/mime/text.py +40 -0
- package/python/Lib/email/parser.py +127 -0
- package/python/Lib/email/policy.py +232 -0
- package/python/Lib/email/quoprimime.py +300 -0
- package/python/Lib/email/utils.py +497 -0
- package/python/Lib/encodings/__init__.py +179 -0
- package/python/Lib/encodings/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/aliases.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/cp1252.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/cp437.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/hex_codec.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/idna.cpython-313.pyc +0 -0
- package/python/Lib/encodings/__pycache__/utf_8.cpython-313.pyc +0 -0
- package/python/Lib/encodings/aliases.py +560 -0
- package/python/Lib/encodings/ascii.py +50 -0
- package/python/Lib/encodings/base64_codec.py +55 -0
- package/python/Lib/encodings/big5.py +39 -0
- package/python/Lib/encodings/big5hkscs.py +39 -0
- package/python/Lib/encodings/bz2_codec.py +78 -0
- package/python/Lib/encodings/charmap.py +69 -0
- package/python/Lib/encodings/cp037.py +307 -0
- package/python/Lib/encodings/cp1006.py +307 -0
- package/python/Lib/encodings/cp1026.py +307 -0
- package/python/Lib/encodings/cp1125.py +698 -0
- package/python/Lib/encodings/cp1140.py +307 -0
- package/python/Lib/encodings/cp1250.py +307 -0
- package/python/Lib/encodings/cp1251.py +307 -0
- package/python/Lib/encodings/cp1252.py +307 -0
- package/python/Lib/encodings/cp1253.py +307 -0
- package/python/Lib/encodings/cp1254.py +307 -0
- package/python/Lib/encodings/cp1255.py +307 -0
- package/python/Lib/encodings/cp1256.py +307 -0
- package/python/Lib/encodings/cp1257.py +307 -0
- package/python/Lib/encodings/cp1258.py +307 -0
- package/python/Lib/encodings/cp273.py +307 -0
- package/python/Lib/encodings/cp424.py +307 -0
- package/python/Lib/encodings/cp437.py +698 -0
- package/python/Lib/encodings/cp500.py +307 -0
- package/python/Lib/encodings/cp720.py +309 -0
- package/python/Lib/encodings/cp737.py +698 -0
- package/python/Lib/encodings/cp775.py +697 -0
- package/python/Lib/encodings/cp850.py +698 -0
- package/python/Lib/encodings/cp852.py +698 -0
- package/python/Lib/encodings/cp855.py +698 -0
- package/python/Lib/encodings/cp856.py +307 -0
- package/python/Lib/encodings/cp857.py +694 -0
- package/python/Lib/encodings/cp858.py +698 -0
- package/python/Lib/encodings/cp860.py +698 -0
- package/python/Lib/encodings/cp861.py +698 -0
- package/python/Lib/encodings/cp862.py +698 -0
- package/python/Lib/encodings/cp863.py +698 -0
- package/python/Lib/encodings/cp864.py +690 -0
- package/python/Lib/encodings/cp865.py +698 -0
- package/python/Lib/encodings/cp866.py +698 -0
- package/python/Lib/encodings/cp869.py +689 -0
- package/python/Lib/encodings/cp874.py +307 -0
- package/python/Lib/encodings/cp875.py +307 -0
- package/python/Lib/encodings/cp932.py +39 -0
- package/python/Lib/encodings/cp949.py +39 -0
- package/python/Lib/encodings/cp950.py +39 -0
- package/python/Lib/encodings/euc_jis_2004.py +39 -0
- package/python/Lib/encodings/euc_jisx0213.py +39 -0
- package/python/Lib/encodings/euc_jp.py +39 -0
- package/python/Lib/encodings/euc_kr.py +39 -0
- package/python/Lib/encodings/gb18030.py +39 -0
- package/python/Lib/encodings/gb2312.py +39 -0
- package/python/Lib/encodings/gbk.py +39 -0
- package/python/Lib/encodings/hex_codec.py +55 -0
- package/python/Lib/encodings/hp_roman8.py +314 -0
- package/python/Lib/encodings/hz.py +39 -0
- package/python/Lib/encodings/idna.py +387 -0
- package/python/Lib/encodings/iso2022_jp.py +39 -0
- package/python/Lib/encodings/iso2022_jp_1.py +39 -0
- package/python/Lib/encodings/iso2022_jp_2.py +39 -0
- package/python/Lib/encodings/iso2022_jp_2004.py +39 -0
- package/python/Lib/encodings/iso2022_jp_3.py +39 -0
- package/python/Lib/encodings/iso2022_jp_ext.py +39 -0
- package/python/Lib/encodings/iso2022_kr.py +39 -0
- package/python/Lib/encodings/iso8859_1.py +307 -0
- package/python/Lib/encodings/iso8859_10.py +307 -0
- package/python/Lib/encodings/iso8859_11.py +307 -0
- package/python/Lib/encodings/iso8859_13.py +307 -0
- package/python/Lib/encodings/iso8859_14.py +307 -0
- package/python/Lib/encodings/iso8859_15.py +307 -0
- package/python/Lib/encodings/iso8859_16.py +307 -0
- package/python/Lib/encodings/iso8859_2.py +307 -0
- package/python/Lib/encodings/iso8859_3.py +307 -0
- package/python/Lib/encodings/iso8859_4.py +307 -0
- package/python/Lib/encodings/iso8859_5.py +307 -0
- package/python/Lib/encodings/iso8859_6.py +307 -0
- package/python/Lib/encodings/iso8859_7.py +307 -0
- package/python/Lib/encodings/iso8859_8.py +307 -0
- package/python/Lib/encodings/iso8859_9.py +307 -0
- package/python/Lib/encodings/johab.py +39 -0
- package/python/Lib/encodings/koi8_r.py +307 -0
- package/python/Lib/encodings/koi8_t.py +308 -0
- package/python/Lib/encodings/koi8_u.py +307 -0
- package/python/Lib/encodings/kz1048.py +307 -0
- package/python/Lib/encodings/latin_1.py +50 -0
- package/python/Lib/encodings/mac_arabic.py +698 -0
- package/python/Lib/encodings/mac_croatian.py +307 -0
- package/python/Lib/encodings/mac_cyrillic.py +307 -0
- package/python/Lib/encodings/mac_farsi.py +307 -0
- package/python/Lib/encodings/mac_greek.py +307 -0
- package/python/Lib/encodings/mac_iceland.py +307 -0
- package/python/Lib/encodings/mac_latin2.py +312 -0
- package/python/Lib/encodings/mac_roman.py +307 -0
- package/python/Lib/encodings/mac_romanian.py +307 -0
- package/python/Lib/encodings/mac_turkish.py +307 -0
- package/python/Lib/encodings/mbcs.py +47 -0
- package/python/Lib/encodings/oem.py +41 -0
- package/python/Lib/encodings/palmos.py +308 -0
- package/python/Lib/encodings/ptcp154.py +312 -0
- package/python/Lib/encodings/punycode.py +253 -0
- package/python/Lib/encodings/quopri_codec.py +56 -0
- package/python/Lib/encodings/raw_unicode_escape.py +46 -0
- package/python/Lib/encodings/rot_13.py +113 -0
- package/python/Lib/encodings/shift_jis.py +39 -0
- package/python/Lib/encodings/shift_jis_2004.py +39 -0
- package/python/Lib/encodings/shift_jisx0213.py +39 -0
- package/python/Lib/encodings/tis_620.py +307 -0
- package/python/Lib/encodings/undefined.py +49 -0
- package/python/Lib/encodings/unicode_escape.py +46 -0
- package/python/Lib/encodings/utf_16.py +155 -0
- package/python/Lib/encodings/utf_16_be.py +42 -0
- package/python/Lib/encodings/utf_16_le.py +42 -0
- package/python/Lib/encodings/utf_32.py +150 -0
- package/python/Lib/encodings/utf_32_be.py +37 -0
- package/python/Lib/encodings/utf_32_le.py +37 -0
- package/python/Lib/encodings/utf_7.py +38 -0
- package/python/Lib/encodings/utf_8.py +42 -0
- package/python/Lib/encodings/utf_8_sig.py +130 -0
- package/python/Lib/encodings/uu_codec.py +103 -0
- package/python/Lib/encodings/zlib_codec.py +77 -0
- package/python/Lib/enum.py +2183 -0
- package/python/Lib/filecmp.py +320 -0
- package/python/Lib/fileinput.py +442 -0
- package/python/Lib/fnmatch.py +192 -0
- package/python/Lib/fractions.py +1043 -0
- package/python/Lib/ftplib.py +975 -0
- package/python/Lib/functools.py +1036 -0
- package/python/Lib/genericpath.py +200 -0
- package/python/Lib/getopt.py +215 -0
- package/python/Lib/getpass.py +192 -0
- package/python/Lib/gettext.py +657 -0
- package/python/Lib/glob.py +572 -0
- package/python/Lib/graphlib.py +250 -0
- package/python/Lib/gzip.py +693 -0
- package/python/Lib/hashlib.py +255 -0
- package/python/Lib/heapq.py +603 -0
- package/python/Lib/hmac.py +220 -0
- package/python/Lib/html/__init__.py +132 -0
- package/python/Lib/html/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/html/__pycache__/entities.cpython-313.pyc +0 -0
- package/python/Lib/html/__pycache__/parser.cpython-313.pyc +0 -0
- package/python/Lib/html/entities.py +2513 -0
- package/python/Lib/html/parser.py +583 -0
- package/python/Lib/http/__init__.py +202 -0
- package/python/Lib/http/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/client.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/cookiejar.cpython-313.pyc +0 -0
- package/python/Lib/http/__pycache__/cookies.cpython-313.pyc +0 -0
- package/python/Lib/http/client.py +1598 -0
- package/python/Lib/http/cookiejar.py +2122 -0
- package/python/Lib/http/cookies.py +635 -0
- package/python/Lib/http/server.py +1355 -0
- package/python/Lib/imaplib.py +1769 -0
- package/python/Lib/importlib/__init__.py +136 -0
- package/python/Lib/importlib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/_abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/__pycache__/readers.cpython-313.pyc +0 -0
- package/python/Lib/importlib/_abc.py +39 -0
- package/python/Lib/importlib/_bootstrap.py +1559 -0
- package/python/Lib/importlib/_bootstrap_external.py +1826 -0
- package/python/Lib/importlib/abc.py +243 -0
- package/python/Lib/importlib/machinery.py +21 -0
- package/python/Lib/importlib/metadata/__init__.py +1093 -0
- package/python/Lib/importlib/metadata/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_adapters.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_collections.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_functools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_itertools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_meta.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/__pycache__/_text.cpython-313.pyc +0 -0
- package/python/Lib/importlib/metadata/_adapters.py +89 -0
- package/python/Lib/importlib/metadata/_collections.py +30 -0
- package/python/Lib/importlib/metadata/_functools.py +104 -0
- package/python/Lib/importlib/metadata/_itertools.py +73 -0
- package/python/Lib/importlib/metadata/_meta.py +67 -0
- package/python/Lib/importlib/metadata/_text.py +99 -0
- package/python/Lib/importlib/metadata/diagnose.py +21 -0
- package/python/Lib/importlib/readers.py +12 -0
- package/python/Lib/importlib/resources/__init__.py +43 -0
- package/python/Lib/importlib/resources/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_adapters.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_common.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_functional.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/_itertools.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/abc.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/__pycache__/readers.cpython-313.pyc +0 -0
- package/python/Lib/importlib/resources/_adapters.py +168 -0
- package/python/Lib/importlib/resources/_common.py +211 -0
- package/python/Lib/importlib/resources/_functional.py +81 -0
- package/python/Lib/importlib/resources/_itertools.py +38 -0
- package/python/Lib/importlib/resources/abc.py +173 -0
- package/python/Lib/importlib/resources/readers.py +203 -0
- package/python/Lib/importlib/resources/simple.py +106 -0
- package/python/Lib/importlib/simple.py +14 -0
- package/python/Lib/importlib/util.py +274 -0
- package/python/Lib/inspect.py +3479 -0
- package/python/Lib/io.py +99 -0
- package/python/Lib/ipaddress.py +2440 -0
- package/python/Lib/json/__init__.py +365 -0
- package/python/Lib/json/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/decoder.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/encoder.cpython-313.pyc +0 -0
- package/python/Lib/json/__pycache__/scanner.cpython-313.pyc +0 -0
- package/python/Lib/json/decoder.py +364 -0
- package/python/Lib/json/encoder.py +446 -0
- package/python/Lib/json/scanner.py +73 -0
- package/python/Lib/json/tool.py +90 -0
- package/python/Lib/keyword.py +64 -0
- package/python/Lib/linecache.py +236 -0
- package/python/Lib/locale.py +1987 -0
- package/python/Lib/logging/__init__.py +2330 -0
- package/python/Lib/logging/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/logging/__pycache__/config.cpython-313.pyc +0 -0
- package/python/Lib/logging/__pycache__/handlers.cpython-313.pyc +0 -0
- package/python/Lib/logging/config.py +1080 -0
- package/python/Lib/logging/handlers.py +1629 -0
- package/python/Lib/lzma.py +364 -0
- package/python/Lib/mailbox.py +2219 -0
- package/python/Lib/mimetypes.py +679 -0
- package/python/Lib/modulefinder.py +671 -0
- package/python/Lib/multiprocessing/__init__.py +37 -0
- package/python/Lib/multiprocessing/connection.py +1216 -0
- package/python/Lib/multiprocessing/context.py +383 -0
- package/python/Lib/multiprocessing/dummy/__init__.py +126 -0
- package/python/Lib/multiprocessing/dummy/connection.py +75 -0
- package/python/Lib/multiprocessing/forkserver.py +373 -0
- package/python/Lib/multiprocessing/heap.py +337 -0
- package/python/Lib/multiprocessing/managers.py +1397 -0
- package/python/Lib/multiprocessing/pool.py +957 -0
- package/python/Lib/multiprocessing/popen_fork.py +97 -0
- package/python/Lib/multiprocessing/popen_forkserver.py +74 -0
- package/python/Lib/multiprocessing/popen_spawn_posix.py +76 -0
- package/python/Lib/multiprocessing/popen_spawn_win32.py +147 -0
- package/python/Lib/multiprocessing/process.py +436 -0
- package/python/Lib/multiprocessing/queues.py +399 -0
- package/python/Lib/multiprocessing/reduction.py +281 -0
- package/python/Lib/multiprocessing/resource_sharer.py +154 -0
- package/python/Lib/multiprocessing/resource_tracker.py +499 -0
- package/python/Lib/multiprocessing/shared_memory.py +544 -0
- package/python/Lib/multiprocessing/sharedctypes.py +240 -0
- package/python/Lib/multiprocessing/spawn.py +307 -0
- package/python/Lib/multiprocessing/synchronize.py +404 -0
- package/python/Lib/multiprocessing/util.py +562 -0
- package/python/Lib/netrc.py +199 -0
- package/python/Lib/ntpath.py +872 -0
- package/python/Lib/nturl2path.py +69 -0
- package/python/Lib/numbers.py +427 -0
- package/python/Lib/opcode.py +115 -0
- package/python/Lib/operator.py +467 -0
- package/python/Lib/optparse.py +1681 -0
- package/python/Lib/os.py +1184 -0
- package/python/Lib/pathlib/__init__.py +12 -0
- package/python/Lib/pathlib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/__pycache__/_abc.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/__pycache__/_local.cpython-313.pyc +0 -0
- package/python/Lib/pathlib/_abc.py +930 -0
- package/python/Lib/pathlib/_local.py +861 -0
- package/python/Lib/pdb.py +2550 -0
- package/python/Lib/pickle.py +1860 -0
- package/python/Lib/pickletools.py +2904 -0
- package/python/Lib/pkgutil.py +529 -0
- package/python/Lib/platform.py +1454 -0
- package/python/Lib/plistlib.py +948 -0
- package/python/Lib/poplib.py +477 -0
- package/python/Lib/posixpath.py +578 -0
- package/python/Lib/pprint.py +658 -0
- package/python/Lib/profile.py +616 -0
- package/python/Lib/pstats.py +778 -0
- package/python/Lib/pty.py +211 -0
- package/python/Lib/py_compile.py +212 -0
- package/python/Lib/pyclbr.py +314 -0
- package/python/Lib/pydoc.py +2861 -0
- package/python/Lib/queue.py +383 -0
- package/python/Lib/quopri.py +237 -0
- package/python/Lib/random.py +1078 -0
- package/python/Lib/re/__init__.py +428 -0
- package/python/Lib/re/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_casefix.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_compiler.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_constants.cpython-313.pyc +0 -0
- package/python/Lib/re/__pycache__/_parser.cpython-313.pyc +0 -0
- package/python/Lib/re/_casefix.py +106 -0
- package/python/Lib/re/_compiler.py +768 -0
- package/python/Lib/re/_constants.py +222 -0
- package/python/Lib/re/_parser.py +1081 -0
- package/python/Lib/reprlib.py +230 -0
- package/python/Lib/rlcompleter.py +222 -0
- package/python/Lib/runpy.py +326 -0
- package/python/Lib/sched.py +167 -0
- package/python/Lib/secrets.py +71 -0
- package/python/Lib/selectors.py +603 -0
- package/python/Lib/shelve.py +250 -0
- package/python/Lib/shlex.py +345 -0
- package/python/Lib/shutil.py +1569 -0
- package/python/Lib/signal.py +94 -0
- package/python/Lib/site.py +773 -0
- package/python/Lib/smtplib.py +1123 -0
- package/python/Lib/socket.py +988 -0
- package/python/Lib/socketserver.py +863 -0
- package/python/Lib/sqlite3/__init__.py +70 -0
- package/python/Lib/sqlite3/__main__.py +139 -0
- package/python/Lib/sqlite3/dbapi2.py +108 -0
- package/python/Lib/sqlite3/dump.py +118 -0
- package/python/Lib/sre_compile.py +7 -0
- package/python/Lib/sre_constants.py +7 -0
- package/python/Lib/sre_parse.py +7 -0
- package/python/Lib/ssl.py +1529 -0
- package/python/Lib/stat.py +212 -0
- package/python/Lib/statistics.py +1817 -0
- package/python/Lib/string.py +314 -0
- package/python/Lib/stringprep.py +272 -0
- package/python/Lib/struct.py +15 -0
- package/python/Lib/subprocess.py +2258 -0
- package/python/Lib/symtable.py +414 -0
- package/python/Lib/sysconfig/__init__.py +734 -0
- package/python/Lib/sysconfig/__main__.py +248 -0
- package/python/Lib/sysconfig/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/tabnanny.py +340 -0
- package/python/Lib/tarfile.py +3136 -0
- package/python/Lib/tempfile.py +958 -0
- package/python/Lib/textwrap.py +497 -0
- package/python/Lib/this.py +28 -0
- package/python/Lib/threading.py +1602 -0
- package/python/Lib/timeit.py +381 -0
- package/python/Lib/token.py +141 -0
- package/python/Lib/tokenize.py +592 -0
- package/python/Lib/tomllib/__init__.py +10 -0
- package/python/Lib/tomllib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_parser.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_re.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/__pycache__/_types.cpython-313.pyc +0 -0
- package/python/Lib/tomllib/_parser.py +703 -0
- package/python/Lib/tomllib/_re.py +107 -0
- package/python/Lib/tomllib/_types.py +10 -0
- package/python/Lib/tomllib/mypy.ini +15 -0
- package/python/Lib/trace.py +754 -0
- package/python/Lib/traceback.py +1639 -0
- package/python/Lib/tracemalloc.py +560 -0
- package/python/Lib/tty.py +73 -0
- package/python/Lib/types.py +346 -0
- package/python/Lib/typing.py +3846 -0
- package/python/Lib/unittest/__init__.py +80 -0
- package/python/Lib/unittest/__main__.py +18 -0
- package/python/Lib/unittest/_log.py +86 -0
- package/python/Lib/unittest/async_case.py +146 -0
- package/python/Lib/unittest/case.py +1478 -0
- package/python/Lib/unittest/loader.py +460 -0
- package/python/Lib/unittest/main.py +280 -0
- package/python/Lib/unittest/mock.py +3189 -0
- package/python/Lib/unittest/result.py +256 -0
- package/python/Lib/unittest/runner.py +292 -0
- package/python/Lib/unittest/signals.py +71 -0
- package/python/Lib/unittest/suite.py +379 -0
- package/python/Lib/unittest/util.py +170 -0
- package/python/Lib/urllib/__init__.py +0 -0
- package/python/Lib/urllib/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/error.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/parse.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/request.cpython-313.pyc +0 -0
- package/python/Lib/urllib/__pycache__/response.cpython-313.pyc +0 -0
- package/python/Lib/urllib/error.py +74 -0
- package/python/Lib/urllib/parse.py +1264 -0
- package/python/Lib/urllib/request.py +2796 -0
- package/python/Lib/urllib/response.py +84 -0
- package/python/Lib/urllib/robotparser.py +363 -0
- package/python/Lib/uuid.py +784 -0
- package/python/Lib/warnings.py +735 -0
- package/python/Lib/wave.py +665 -0
- package/python/Lib/weakref.py +674 -0
- package/python/Lib/webbrowser.py +724 -0
- package/python/Lib/wsgiref/__init__.py +25 -0
- package/python/Lib/wsgiref/handlers.py +575 -0
- package/python/Lib/wsgiref/headers.py +192 -0
- package/python/Lib/wsgiref/simple_server.py +161 -0
- package/python/Lib/wsgiref/types.py +54 -0
- package/python/Lib/wsgiref/util.py +159 -0
- package/python/Lib/wsgiref/validate.py +438 -0
- package/python/Lib/xml/__init__.py +20 -0
- package/python/Lib/xml/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xml/dom/NodeFilter.py +27 -0
- package/python/Lib/xml/dom/__init__.py +140 -0
- package/python/Lib/xml/dom/domreg.py +99 -0
- package/python/Lib/xml/dom/expatbuilder.py +962 -0
- package/python/Lib/xml/dom/minicompat.py +109 -0
- package/python/Lib/xml/dom/minidom.py +2024 -0
- package/python/Lib/xml/dom/pulldom.py +336 -0
- package/python/Lib/xml/dom/xmlbuilder.py +389 -0
- package/python/Lib/xml/etree/ElementInclude.py +186 -0
- package/python/Lib/xml/etree/ElementPath.py +430 -0
- package/python/Lib/xml/etree/ElementTree.py +2116 -0
- package/python/Lib/xml/etree/__init__.py +33 -0
- package/python/Lib/xml/etree/cElementTree.py +3 -0
- package/python/Lib/xml/parsers/__init__.py +8 -0
- package/python/Lib/xml/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xml/parsers/__pycache__/expat.cpython-313.pyc +0 -0
- package/python/Lib/xml/parsers/expat.py +8 -0
- package/python/Lib/xml/sax/__init__.py +94 -0
- package/python/Lib/xml/sax/_exceptions.py +127 -0
- package/python/Lib/xml/sax/expatreader.py +454 -0
- package/python/Lib/xml/sax/handler.py +387 -0
- package/python/Lib/xml/sax/saxutils.py +369 -0
- package/python/Lib/xml/sax/xmlreader.py +378 -0
- package/python/Lib/xmlrpc/__init__.py +1 -0
- package/python/Lib/xmlrpc/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/xmlrpc/__pycache__/client.cpython-313.pyc +0 -0
- package/python/Lib/xmlrpc/client.py +1503 -0
- package/python/Lib/xmlrpc/server.py +1002 -0
- package/python/Lib/zipapp.py +229 -0
- package/python/Lib/zipfile/__init__.py +2391 -0
- package/python/Lib/zipfile/__main__.py +4 -0
- package/python/Lib/zipfile/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/__init__.py +452 -0
- package/python/Lib/zipfile/_path/__pycache__/__init__.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/__pycache__/glob.cpython-313.pyc +0 -0
- package/python/Lib/zipfile/_path/glob.py +113 -0
- package/python/Lib/zipimport.py +803 -0
- package/python/Lib/zoneinfo/__init__.py +34 -0
- package/python/Lib/zoneinfo/_common.py +172 -0
- package/python/Lib/zoneinfo/_tzpath.py +189 -0
- package/python/Lib/zoneinfo/_zoneinfo.py +779 -0
- package/python/licenses/LICENSE.bdb.txt +126 -0
- package/python/licenses/LICENSE.bzip2.txt +37 -0
- package/python/licenses/LICENSE.cpython.txt +771 -0
- package/python/licenses/LICENSE.expat.txt +21 -0
- package/python/licenses/LICENSE.libX11.txt +942 -0
- package/python/licenses/LICENSE.libXau.txt +21 -0
- package/python/licenses/LICENSE.libedit.txt +29 -0
- package/python/licenses/LICENSE.libffi.txt +21 -0
- package/python/licenses/LICENSE.liblzma.txt +13 -0
- package/python/licenses/LICENSE.libuuid.txt +27 -0
- package/python/licenses/LICENSE.libxcb.txt +30 -0
- package/python/licenses/LICENSE.mpdecimal.txt +24 -0
- package/python/licenses/LICENSE.ncurses.txt +29 -0
- package/python/licenses/LICENSE.openssl-1.1.txt +124 -0
- package/python/licenses/LICENSE.openssl-3.txt +177 -0
- package/python/licenses/LICENSE.sqlite.txt +23 -0
- package/python/licenses/LICENSE.tcl.txt +40 -0
- package/python/licenses/LICENSE.tix.txt +54 -0
- package/python/licenses/LICENSE.zlib.txt +21 -0
- package/python/python.exe +0 -0
- package/python/python3.dll +0 -0
- package/python/python313.dll +0 -0
- package/python/pythonw.exe +0 -0
- package/python/vcruntime140.dll +0 -0
- package/python/vcruntime140_1.dll +0 -0
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Module providing various facilities to other parts of the package
|
|
3
|
+
#
|
|
4
|
+
# multiprocessing/util.py
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2006-2008, R Oudkerk
|
|
7
|
+
# Licensed to PSF under a Contributor Agreement.
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
import os
|
|
11
|
+
import itertools
|
|
12
|
+
import sys
|
|
13
|
+
import weakref
|
|
14
|
+
import atexit
|
|
15
|
+
import threading # we want threading to install it's
|
|
16
|
+
# cleanup function before multiprocessing does
|
|
17
|
+
from subprocess import _args_from_interpreter_flags
|
|
18
|
+
|
|
19
|
+
from . import process
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
'sub_debug', 'debug', 'info', 'sub_warning', 'get_logger',
|
|
23
|
+
'log_to_stderr', 'get_temp_dir', 'register_after_fork',
|
|
24
|
+
'is_exiting', 'Finalize', 'ForkAwareThreadLock', 'ForkAwareLocal',
|
|
25
|
+
'close_all_fds_except', 'SUBDEBUG', 'SUBWARNING',
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Logging
|
|
30
|
+
#
|
|
31
|
+
|
|
32
|
+
NOTSET = 0
|
|
33
|
+
SUBDEBUG = 5
|
|
34
|
+
DEBUG = 10
|
|
35
|
+
INFO = 20
|
|
36
|
+
SUBWARNING = 25
|
|
37
|
+
WARNING = 30
|
|
38
|
+
|
|
39
|
+
LOGGER_NAME = 'multiprocessing'
|
|
40
|
+
DEFAULT_LOGGING_FORMAT = '[%(levelname)s/%(processName)s] %(message)s'
|
|
41
|
+
|
|
42
|
+
_logger = None
|
|
43
|
+
_log_to_stderr = False
|
|
44
|
+
|
|
45
|
+
def sub_debug(msg, *args):
|
|
46
|
+
if _logger:
|
|
47
|
+
_logger.log(SUBDEBUG, msg, *args, stacklevel=2)
|
|
48
|
+
|
|
49
|
+
def debug(msg, *args):
|
|
50
|
+
if _logger:
|
|
51
|
+
_logger.log(DEBUG, msg, *args, stacklevel=2)
|
|
52
|
+
|
|
53
|
+
def info(msg, *args):
|
|
54
|
+
if _logger:
|
|
55
|
+
_logger.log(INFO, msg, *args, stacklevel=2)
|
|
56
|
+
|
|
57
|
+
def _warn(msg, *args):
|
|
58
|
+
if _logger:
|
|
59
|
+
_logger.log(WARNING, msg, *args, stacklevel=2)
|
|
60
|
+
|
|
61
|
+
def sub_warning(msg, *args):
|
|
62
|
+
if _logger:
|
|
63
|
+
_logger.log(SUBWARNING, msg, *args, stacklevel=2)
|
|
64
|
+
|
|
65
|
+
def get_logger():
|
|
66
|
+
'''
|
|
67
|
+
Returns logger used by multiprocessing
|
|
68
|
+
'''
|
|
69
|
+
global _logger
|
|
70
|
+
import logging
|
|
71
|
+
|
|
72
|
+
with logging._lock:
|
|
73
|
+
if not _logger:
|
|
74
|
+
|
|
75
|
+
_logger = logging.getLogger(LOGGER_NAME)
|
|
76
|
+
_logger.propagate = 0
|
|
77
|
+
|
|
78
|
+
# XXX multiprocessing should cleanup before logging
|
|
79
|
+
if hasattr(atexit, 'unregister'):
|
|
80
|
+
atexit.unregister(_exit_function)
|
|
81
|
+
atexit.register(_exit_function)
|
|
82
|
+
else:
|
|
83
|
+
atexit._exithandlers.remove((_exit_function, (), {}))
|
|
84
|
+
atexit._exithandlers.append((_exit_function, (), {}))
|
|
85
|
+
|
|
86
|
+
return _logger
|
|
87
|
+
|
|
88
|
+
def log_to_stderr(level=None):
|
|
89
|
+
'''
|
|
90
|
+
Turn on logging and add a handler which prints to stderr
|
|
91
|
+
'''
|
|
92
|
+
global _log_to_stderr
|
|
93
|
+
import logging
|
|
94
|
+
|
|
95
|
+
logger = get_logger()
|
|
96
|
+
formatter = logging.Formatter(DEFAULT_LOGGING_FORMAT)
|
|
97
|
+
handler = logging.StreamHandler()
|
|
98
|
+
handler.setFormatter(formatter)
|
|
99
|
+
logger.addHandler(handler)
|
|
100
|
+
|
|
101
|
+
if level:
|
|
102
|
+
logger.setLevel(level)
|
|
103
|
+
_log_to_stderr = True
|
|
104
|
+
return _logger
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
# Abstract socket support
|
|
108
|
+
|
|
109
|
+
def _platform_supports_abstract_sockets():
|
|
110
|
+
return sys.platform in ("linux", "android")
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def is_abstract_socket_namespace(address):
|
|
114
|
+
if not address:
|
|
115
|
+
return False
|
|
116
|
+
if isinstance(address, bytes):
|
|
117
|
+
return address[0] == 0
|
|
118
|
+
elif isinstance(address, str):
|
|
119
|
+
return address[0] == "\0"
|
|
120
|
+
raise TypeError(f'address type of {address!r} unrecognized')
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
abstract_sockets_supported = _platform_supports_abstract_sockets()
|
|
124
|
+
|
|
125
|
+
#
|
|
126
|
+
# Function returning a temp directory which will be removed on exit
|
|
127
|
+
#
|
|
128
|
+
|
|
129
|
+
# Maximum length of a NULL-terminated [1] socket file path is usually
|
|
130
|
+
# between 92 and 108 [2], but Linux is known to use a size of 108 [3].
|
|
131
|
+
# BSD-based systems usually use a size of 104 or 108 and Windows does
|
|
132
|
+
# not create AF_UNIX sockets.
|
|
133
|
+
#
|
|
134
|
+
# [1]: https://github.com/python/cpython/issues/140734
|
|
135
|
+
# [2]: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/sys_un.h.html
|
|
136
|
+
# [3]: https://man7.org/linux/man-pages/man7/unix.7.html
|
|
137
|
+
|
|
138
|
+
if sys.platform == 'linux':
|
|
139
|
+
_SUN_PATH_MAX = 108
|
|
140
|
+
elif sys.platform.startswith(('openbsd', 'freebsd')):
|
|
141
|
+
_SUN_PATH_MAX = 104
|
|
142
|
+
else:
|
|
143
|
+
# On Windows platforms, we do not create AF_UNIX sockets.
|
|
144
|
+
_SUN_PATH_MAX = None if os.name == 'nt' else 92
|
|
145
|
+
|
|
146
|
+
def _remove_temp_dir(rmtree, tempdir):
|
|
147
|
+
rmtree(tempdir)
|
|
148
|
+
|
|
149
|
+
current_process = process.current_process()
|
|
150
|
+
# current_process() can be None if the finalizer is called
|
|
151
|
+
# late during Python finalization
|
|
152
|
+
if current_process is not None:
|
|
153
|
+
current_process._config['tempdir'] = None
|
|
154
|
+
|
|
155
|
+
def _get_base_temp_dir(tempfile):
|
|
156
|
+
"""Get a temporary directory where socket files will be created.
|
|
157
|
+
|
|
158
|
+
To prevent additional imports, pass a pre-imported 'tempfile' module.
|
|
159
|
+
"""
|
|
160
|
+
if os.name == 'nt':
|
|
161
|
+
return None
|
|
162
|
+
# Most of the time, the default temporary directory is /tmp. Thus,
|
|
163
|
+
# listener sockets files "$TMPDIR/pymp-XXXXXXXX/sock-XXXXXXXX" do
|
|
164
|
+
# not have a path length exceeding SUN_PATH_MAX.
|
|
165
|
+
#
|
|
166
|
+
# If users specify their own temporary directory, we may be unable
|
|
167
|
+
# to create those files. Therefore, we fall back to the system-wide
|
|
168
|
+
# temporary directory /tmp, assumed to exist on POSIX systems.
|
|
169
|
+
#
|
|
170
|
+
# See https://github.com/python/cpython/issues/132124.
|
|
171
|
+
base_tempdir = tempfile.gettempdir()
|
|
172
|
+
# Files created in a temporary directory are suffixed by a string
|
|
173
|
+
# generated by tempfile._RandomNameSequence, which, by design,
|
|
174
|
+
# is 8 characters long.
|
|
175
|
+
#
|
|
176
|
+
# Thus, the socket file path length (without NULL terminator) will be:
|
|
177
|
+
#
|
|
178
|
+
# len(base_tempdir + '/pymp-XXXXXXXX' + '/sock-XXXXXXXX')
|
|
179
|
+
sun_path_len = len(base_tempdir) + 14 + 14
|
|
180
|
+
# Strict inequality to account for the NULL terminator.
|
|
181
|
+
# See https://github.com/python/cpython/issues/140734.
|
|
182
|
+
if sun_path_len < _SUN_PATH_MAX:
|
|
183
|
+
return base_tempdir
|
|
184
|
+
# Fallback to the default system-wide temporary directory.
|
|
185
|
+
# This ignores user-defined environment variables.
|
|
186
|
+
#
|
|
187
|
+
# On POSIX systems, /tmp MUST be writable by any application [1].
|
|
188
|
+
# We however emit a warning if this is not the case to prevent
|
|
189
|
+
# obscure errors later in the execution.
|
|
190
|
+
#
|
|
191
|
+
# On some legacy systems, /var/tmp and /usr/tmp can be present
|
|
192
|
+
# and will be used instead.
|
|
193
|
+
#
|
|
194
|
+
# [1]: https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s18.html
|
|
195
|
+
dirlist = ['/tmp', '/var/tmp', '/usr/tmp']
|
|
196
|
+
try:
|
|
197
|
+
base_system_tempdir = tempfile._get_default_tempdir(dirlist)
|
|
198
|
+
except FileNotFoundError:
|
|
199
|
+
_warn("Process-wide temporary directory %s will not be usable for "
|
|
200
|
+
"creating socket files and no usable system-wide temporary "
|
|
201
|
+
"directory was found in %s", base_tempdir, dirlist)
|
|
202
|
+
# At this point, the system-wide temporary directory is not usable
|
|
203
|
+
# but we may assume that the user-defined one is, even if we will
|
|
204
|
+
# not be able to write socket files out there.
|
|
205
|
+
return base_tempdir
|
|
206
|
+
_warn("Ignoring user-defined temporary directory: %s", base_tempdir)
|
|
207
|
+
# at most max(map(len, dirlist)) + 14 + 14 = 36 characters
|
|
208
|
+
assert len(base_system_tempdir) + 14 + 14 < _SUN_PATH_MAX
|
|
209
|
+
return base_system_tempdir
|
|
210
|
+
|
|
211
|
+
def get_temp_dir():
|
|
212
|
+
# get name of a temp directory which will be automatically cleaned up
|
|
213
|
+
tempdir = process.current_process()._config.get('tempdir')
|
|
214
|
+
if tempdir is None:
|
|
215
|
+
import shutil, tempfile
|
|
216
|
+
base_tempdir = _get_base_temp_dir(tempfile)
|
|
217
|
+
tempdir = tempfile.mkdtemp(prefix='pymp-', dir=base_tempdir)
|
|
218
|
+
info('created temp directory %s', tempdir)
|
|
219
|
+
# keep a strong reference to shutil.rmtree(), since the finalizer
|
|
220
|
+
# can be called late during Python shutdown
|
|
221
|
+
Finalize(None, _remove_temp_dir, args=(shutil.rmtree, tempdir),
|
|
222
|
+
exitpriority=-100)
|
|
223
|
+
process.current_process()._config['tempdir'] = tempdir
|
|
224
|
+
return tempdir
|
|
225
|
+
|
|
226
|
+
#
|
|
227
|
+
# Support for reinitialization of objects when bootstrapping a child process
|
|
228
|
+
#
|
|
229
|
+
|
|
230
|
+
_afterfork_registry = weakref.WeakValueDictionary()
|
|
231
|
+
_afterfork_counter = itertools.count()
|
|
232
|
+
|
|
233
|
+
def _run_after_forkers():
|
|
234
|
+
items = list(_afterfork_registry.items())
|
|
235
|
+
items.sort()
|
|
236
|
+
for (index, ident, func), obj in items:
|
|
237
|
+
try:
|
|
238
|
+
func(obj)
|
|
239
|
+
except Exception as e:
|
|
240
|
+
info('after forker raised exception %s', e)
|
|
241
|
+
|
|
242
|
+
def register_after_fork(obj, func):
|
|
243
|
+
_afterfork_registry[(next(_afterfork_counter), id(obj), func)] = obj
|
|
244
|
+
|
|
245
|
+
#
|
|
246
|
+
# Finalization using weakrefs
|
|
247
|
+
#
|
|
248
|
+
|
|
249
|
+
_finalizer_registry = {}
|
|
250
|
+
_finalizer_counter = itertools.count()
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
class Finalize(object):
|
|
254
|
+
'''
|
|
255
|
+
Class which supports object finalization using weakrefs
|
|
256
|
+
'''
|
|
257
|
+
def __init__(self, obj, callback, args=(), kwargs=None, exitpriority=None):
|
|
258
|
+
if (exitpriority is not None) and not isinstance(exitpriority,int):
|
|
259
|
+
raise TypeError(
|
|
260
|
+
"Exitpriority ({0!r}) must be None or int, not {1!s}".format(
|
|
261
|
+
exitpriority, type(exitpriority)))
|
|
262
|
+
|
|
263
|
+
if obj is not None:
|
|
264
|
+
self._weakref = weakref.ref(obj, self)
|
|
265
|
+
elif exitpriority is None:
|
|
266
|
+
raise ValueError("Without object, exitpriority cannot be None")
|
|
267
|
+
|
|
268
|
+
self._callback = callback
|
|
269
|
+
self._args = args
|
|
270
|
+
self._kwargs = kwargs or {}
|
|
271
|
+
self._key = (exitpriority, next(_finalizer_counter))
|
|
272
|
+
self._pid = os.getpid()
|
|
273
|
+
|
|
274
|
+
_finalizer_registry[self._key] = self
|
|
275
|
+
|
|
276
|
+
def __call__(self, wr=None,
|
|
277
|
+
# Need to bind these locally because the globals can have
|
|
278
|
+
# been cleared at shutdown
|
|
279
|
+
_finalizer_registry=_finalizer_registry,
|
|
280
|
+
sub_debug=sub_debug, getpid=os.getpid):
|
|
281
|
+
'''
|
|
282
|
+
Run the callback unless it has already been called or cancelled
|
|
283
|
+
'''
|
|
284
|
+
try:
|
|
285
|
+
del _finalizer_registry[self._key]
|
|
286
|
+
except KeyError:
|
|
287
|
+
sub_debug('finalizer no longer registered')
|
|
288
|
+
else:
|
|
289
|
+
if self._pid != getpid():
|
|
290
|
+
sub_debug('finalizer ignored because different process')
|
|
291
|
+
res = None
|
|
292
|
+
else:
|
|
293
|
+
sub_debug('finalizer calling %s with args %s and kwargs %s',
|
|
294
|
+
self._callback, self._args, self._kwargs)
|
|
295
|
+
res = self._callback(*self._args, **self._kwargs)
|
|
296
|
+
self._weakref = self._callback = self._args = \
|
|
297
|
+
self._kwargs = self._key = None
|
|
298
|
+
return res
|
|
299
|
+
|
|
300
|
+
def cancel(self):
|
|
301
|
+
'''
|
|
302
|
+
Cancel finalization of the object
|
|
303
|
+
'''
|
|
304
|
+
try:
|
|
305
|
+
del _finalizer_registry[self._key]
|
|
306
|
+
except KeyError:
|
|
307
|
+
pass
|
|
308
|
+
else:
|
|
309
|
+
self._weakref = self._callback = self._args = \
|
|
310
|
+
self._kwargs = self._key = None
|
|
311
|
+
|
|
312
|
+
def still_active(self):
|
|
313
|
+
'''
|
|
314
|
+
Return whether this finalizer is still waiting to invoke callback
|
|
315
|
+
'''
|
|
316
|
+
return self._key in _finalizer_registry
|
|
317
|
+
|
|
318
|
+
def __repr__(self):
|
|
319
|
+
try:
|
|
320
|
+
obj = self._weakref()
|
|
321
|
+
except (AttributeError, TypeError):
|
|
322
|
+
obj = None
|
|
323
|
+
|
|
324
|
+
if obj is None:
|
|
325
|
+
return '<%s object, dead>' % self.__class__.__name__
|
|
326
|
+
|
|
327
|
+
x = '<%s object, callback=%s' % (
|
|
328
|
+
self.__class__.__name__,
|
|
329
|
+
getattr(self._callback, '__name__', self._callback))
|
|
330
|
+
if self._args:
|
|
331
|
+
x += ', args=' + str(self._args)
|
|
332
|
+
if self._kwargs:
|
|
333
|
+
x += ', kwargs=' + str(self._kwargs)
|
|
334
|
+
if self._key[0] is not None:
|
|
335
|
+
x += ', exitpriority=' + str(self._key[0])
|
|
336
|
+
return x + '>'
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def _run_finalizers(minpriority=None):
|
|
340
|
+
'''
|
|
341
|
+
Run all finalizers whose exit priority is not None and at least minpriority
|
|
342
|
+
|
|
343
|
+
Finalizers with highest priority are called first; finalizers with
|
|
344
|
+
the same priority will be called in reverse order of creation.
|
|
345
|
+
'''
|
|
346
|
+
if _finalizer_registry is None:
|
|
347
|
+
# This function may be called after this module's globals are
|
|
348
|
+
# destroyed. See the _exit_function function in this module for more
|
|
349
|
+
# notes.
|
|
350
|
+
return
|
|
351
|
+
|
|
352
|
+
if minpriority is None:
|
|
353
|
+
f = lambda p : p[0] is not None
|
|
354
|
+
else:
|
|
355
|
+
f = lambda p : p[0] is not None and p[0] >= minpriority
|
|
356
|
+
|
|
357
|
+
# Careful: _finalizer_registry may be mutated while this function
|
|
358
|
+
# is running (either by a GC run or by another thread).
|
|
359
|
+
|
|
360
|
+
# list(_finalizer_registry) should be atomic, while
|
|
361
|
+
# list(_finalizer_registry.items()) is not.
|
|
362
|
+
keys = [key for key in list(_finalizer_registry) if f(key)]
|
|
363
|
+
keys.sort(reverse=True)
|
|
364
|
+
|
|
365
|
+
for key in keys:
|
|
366
|
+
finalizer = _finalizer_registry.get(key)
|
|
367
|
+
# key may have been removed from the registry
|
|
368
|
+
if finalizer is not None:
|
|
369
|
+
sub_debug('calling %s', finalizer)
|
|
370
|
+
try:
|
|
371
|
+
finalizer()
|
|
372
|
+
except Exception:
|
|
373
|
+
import traceback
|
|
374
|
+
traceback.print_exc()
|
|
375
|
+
|
|
376
|
+
if minpriority is None:
|
|
377
|
+
_finalizer_registry.clear()
|
|
378
|
+
|
|
379
|
+
#
|
|
380
|
+
# Clean up on exit
|
|
381
|
+
#
|
|
382
|
+
|
|
383
|
+
def is_exiting():
|
|
384
|
+
'''
|
|
385
|
+
Returns true if the process is shutting down
|
|
386
|
+
'''
|
|
387
|
+
return _exiting or _exiting is None
|
|
388
|
+
|
|
389
|
+
_exiting = False
|
|
390
|
+
|
|
391
|
+
def _exit_function(info=info, debug=debug, _run_finalizers=_run_finalizers,
|
|
392
|
+
active_children=process.active_children,
|
|
393
|
+
current_process=process.current_process):
|
|
394
|
+
# We hold on to references to functions in the arglist due to the
|
|
395
|
+
# situation described below, where this function is called after this
|
|
396
|
+
# module's globals are destroyed.
|
|
397
|
+
|
|
398
|
+
global _exiting
|
|
399
|
+
|
|
400
|
+
if not _exiting:
|
|
401
|
+
_exiting = True
|
|
402
|
+
|
|
403
|
+
info('process shutting down')
|
|
404
|
+
debug('running all "atexit" finalizers with priority >= 0')
|
|
405
|
+
_run_finalizers(0)
|
|
406
|
+
|
|
407
|
+
if current_process() is not None:
|
|
408
|
+
# We check if the current process is None here because if
|
|
409
|
+
# it's None, any call to ``active_children()`` will raise
|
|
410
|
+
# an AttributeError (active_children winds up trying to
|
|
411
|
+
# get attributes from util._current_process). One
|
|
412
|
+
# situation where this can happen is if someone has
|
|
413
|
+
# manipulated sys.modules, causing this module to be
|
|
414
|
+
# garbage collected. The destructor for the module type
|
|
415
|
+
# then replaces all values in the module dict with None.
|
|
416
|
+
# For instance, after setuptools runs a test it replaces
|
|
417
|
+
# sys.modules with a copy created earlier. See issues
|
|
418
|
+
# #9775 and #15881. Also related: #4106, #9205, and
|
|
419
|
+
# #9207.
|
|
420
|
+
|
|
421
|
+
for p in active_children():
|
|
422
|
+
if p.daemon:
|
|
423
|
+
info('calling terminate() for daemon %s', p.name)
|
|
424
|
+
p._popen.terminate()
|
|
425
|
+
|
|
426
|
+
for p in active_children():
|
|
427
|
+
info('calling join() for process %s', p.name)
|
|
428
|
+
p.join()
|
|
429
|
+
|
|
430
|
+
debug('running the remaining "atexit" finalizers')
|
|
431
|
+
_run_finalizers()
|
|
432
|
+
|
|
433
|
+
atexit.register(_exit_function)
|
|
434
|
+
|
|
435
|
+
#
|
|
436
|
+
# Some fork aware types
|
|
437
|
+
#
|
|
438
|
+
|
|
439
|
+
class ForkAwareThreadLock(object):
|
|
440
|
+
def __init__(self):
|
|
441
|
+
self._lock = threading.Lock()
|
|
442
|
+
self.acquire = self._lock.acquire
|
|
443
|
+
self.release = self._lock.release
|
|
444
|
+
register_after_fork(self, ForkAwareThreadLock._at_fork_reinit)
|
|
445
|
+
|
|
446
|
+
def _at_fork_reinit(self):
|
|
447
|
+
self._lock._at_fork_reinit()
|
|
448
|
+
|
|
449
|
+
def __enter__(self):
|
|
450
|
+
return self._lock.__enter__()
|
|
451
|
+
|
|
452
|
+
def __exit__(self, *args):
|
|
453
|
+
return self._lock.__exit__(*args)
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
class ForkAwareLocal(threading.local):
|
|
457
|
+
def __init__(self):
|
|
458
|
+
register_after_fork(self, lambda obj : obj.__dict__.clear())
|
|
459
|
+
def __reduce__(self):
|
|
460
|
+
return type(self), ()
|
|
461
|
+
|
|
462
|
+
#
|
|
463
|
+
# Close fds except those specified
|
|
464
|
+
#
|
|
465
|
+
|
|
466
|
+
try:
|
|
467
|
+
MAXFD = os.sysconf("SC_OPEN_MAX")
|
|
468
|
+
except Exception:
|
|
469
|
+
MAXFD = 256
|
|
470
|
+
|
|
471
|
+
def close_all_fds_except(fds):
|
|
472
|
+
fds = list(fds) + [-1, MAXFD]
|
|
473
|
+
fds.sort()
|
|
474
|
+
assert fds[-1] == MAXFD, 'fd too large'
|
|
475
|
+
for i in range(len(fds) - 1):
|
|
476
|
+
os.closerange(fds[i]+1, fds[i+1])
|
|
477
|
+
#
|
|
478
|
+
# Close sys.stdin and replace stdin with os.devnull
|
|
479
|
+
#
|
|
480
|
+
|
|
481
|
+
def _close_stdin():
|
|
482
|
+
if sys.stdin is None:
|
|
483
|
+
return
|
|
484
|
+
|
|
485
|
+
try:
|
|
486
|
+
sys.stdin.close()
|
|
487
|
+
except (OSError, ValueError):
|
|
488
|
+
pass
|
|
489
|
+
|
|
490
|
+
try:
|
|
491
|
+
fd = os.open(os.devnull, os.O_RDONLY)
|
|
492
|
+
try:
|
|
493
|
+
sys.stdin = open(fd, encoding="utf-8", closefd=False)
|
|
494
|
+
except:
|
|
495
|
+
os.close(fd)
|
|
496
|
+
raise
|
|
497
|
+
except (OSError, ValueError):
|
|
498
|
+
pass
|
|
499
|
+
|
|
500
|
+
#
|
|
501
|
+
# Flush standard streams, if any
|
|
502
|
+
#
|
|
503
|
+
|
|
504
|
+
def _flush_std_streams():
|
|
505
|
+
try:
|
|
506
|
+
sys.stdout.flush()
|
|
507
|
+
except (AttributeError, ValueError):
|
|
508
|
+
pass
|
|
509
|
+
try:
|
|
510
|
+
sys.stderr.flush()
|
|
511
|
+
except (AttributeError, ValueError):
|
|
512
|
+
pass
|
|
513
|
+
|
|
514
|
+
#
|
|
515
|
+
# Start a program with only specified fds kept open
|
|
516
|
+
#
|
|
517
|
+
|
|
518
|
+
def spawnv_passfds(path, args, passfds):
|
|
519
|
+
import _posixsubprocess
|
|
520
|
+
import subprocess
|
|
521
|
+
passfds = tuple(sorted(map(int, passfds)))
|
|
522
|
+
errpipe_read, errpipe_write = os.pipe()
|
|
523
|
+
try:
|
|
524
|
+
return _posixsubprocess.fork_exec(
|
|
525
|
+
args, [path], True, passfds, None, None,
|
|
526
|
+
-1, -1, -1, -1, -1, -1, errpipe_read, errpipe_write,
|
|
527
|
+
False, False, -1, None, None, None, -1, None,
|
|
528
|
+
subprocess._USE_VFORK)
|
|
529
|
+
finally:
|
|
530
|
+
os.close(errpipe_read)
|
|
531
|
+
os.close(errpipe_write)
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def close_fds(*fds):
|
|
535
|
+
"""Close each file descriptor given as an argument"""
|
|
536
|
+
for fd in fds:
|
|
537
|
+
os.close(fd)
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
def _cleanup_tests():
|
|
541
|
+
"""Cleanup multiprocessing resources when multiprocessing tests
|
|
542
|
+
completed."""
|
|
543
|
+
|
|
544
|
+
from test import support
|
|
545
|
+
|
|
546
|
+
# cleanup multiprocessing
|
|
547
|
+
process._cleanup()
|
|
548
|
+
|
|
549
|
+
# Stop the ForkServer process if it's running
|
|
550
|
+
from multiprocessing import forkserver
|
|
551
|
+
forkserver._forkserver._stop()
|
|
552
|
+
|
|
553
|
+
# Stop the ResourceTracker process if it's running
|
|
554
|
+
from multiprocessing import resource_tracker
|
|
555
|
+
resource_tracker._resource_tracker._stop()
|
|
556
|
+
|
|
557
|
+
# bpo-37421: Explicitly call _run_finalizers() to remove immediately
|
|
558
|
+
# temporary directories created by multiprocessing.util.get_temp_dir().
|
|
559
|
+
_run_finalizers()
|
|
560
|
+
support.gc_collect()
|
|
561
|
+
|
|
562
|
+
support.reap_children()
|