py2docfx 0.1.15rc2025477__py3-none-any.whl → 0.1.16.dev2052678__py3-none-any.whl
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.
- py2docfx/docfx_yaml/process_doctree.py +21 -34
- py2docfx/docfx_yaml/tests/test_method_arguments.py +1 -7
- py2docfx/docfx_yaml/tests/test_process_doctree.py +120 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_core_metadata.py +21 -5
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +13 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/ccompiler.py +5 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build.py +1 -6
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +1 -9
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +1 -8
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/check.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/config.py +0 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/install.py +8 -17
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +8 -5
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +15 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/dist.py +2 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/sysconfig.py +0 -10
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +60 -5
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +6 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/util.py +7 -6
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_normalization.py +29 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +2 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +25 -594
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +6 -6
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +282 -223
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +22 -9
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +16 -13
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/util.py +0 -9
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +40 -9
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/bdist_wheel.py +6 -2
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +49 -11
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +31 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +222 -129
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +30 -3
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/dist.py +168 -51
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/msvc.py +12 -3
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +246 -13
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +42 -29
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +1 -1
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +93 -8
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_build_meta.py +17 -4
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_core_metadata.py +45 -0
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_egg_info.py +24 -4
- py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_sdist.py +13 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/any_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/api_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/compiler/plugin_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor_database.py +22 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor_pb2.py +82 -35
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/duration_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/empty_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/field_mask_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/builder.py +4 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/containers.py +13 -0
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/decoder.py +62 -115
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/python_edition_defaults.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/python_message.py +15 -18
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/testing_refleaks.py +4 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/type_checkers.py +5 -0
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/well_known_types.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/json_format.py +25 -9
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/message.py +26 -0
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/message_factory.py +0 -63
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/proto.py +38 -1
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/proto_text.py +129 -0
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/reflection.py +0 -49
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/runtime_version.py +3 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/source_context_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/struct_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/symbol_database.py +0 -18
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/text_format.py +8 -3
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/timestamp_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/type_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/unknown_fields.py +3 -4
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/wrappers_pb2.py +4 -4
- py2docfx/venv/venv1/Lib/site-packages/msal/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/msal/application.py +51 -17
- py2docfx/venv/venv1/Lib/site-packages/msal/broker.py +18 -4
- py2docfx/venv/venv1/Lib/site-packages/msal/cloudshell.py +5 -1
- py2docfx/venv/venv1/Lib/site-packages/msal/managed_identity.py +5 -4
- py2docfx/venv/venv1/Lib/site-packages/msal/sku.py +6 -0
- py2docfx/venv/venv1/Lib/site-packages/msal/token_cache.py +31 -10
- py2docfx/venv/venv1/Lib/site-packages/msal_extensions/__init__.py +2 -3
- py2docfx/venv/venv1/Lib/site-packages/msal_extensions/cache_lock.py +4 -1
- py2docfx/venv/venv1/Lib/site-packages/msal_extensions/filelock.py +62 -0
- py2docfx/venv/venv1/Lib/site-packages/msal_extensions/libsecret.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/msal_extensions/token_cache.py +7 -1
- py2docfx/venv/venv1/Lib/site-packages/pyasn1_modules/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_core_metadata.py +21 -5
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +13 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/ccompiler.py +5 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build.py +1 -6
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build_clib.py +1 -9
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build_ext.py +1 -8
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/check.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/config.py +0 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/install.py +8 -17
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +8 -5
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +15 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/dist.py +2 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/sysconfig.py +0 -10
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +60 -5
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/unixccompiler.py +6 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/util.py +7 -6
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_normalization.py +29 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +2 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +25 -594
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +6 -6
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +282 -223
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +22 -9
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +16 -13
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/util.py +0 -9
- py2docfx/venv/venv1/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +40 -9
- py2docfx/venv/venv1/Lib/site-packages/setuptools/command/bdist_wheel.py +6 -2
- py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +49 -11
- py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +31 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +222 -129
- py2docfx/venv/venv1/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +30 -3
- py2docfx/venv/venv1/Lib/site-packages/setuptools/dist.py +168 -51
- py2docfx/venv/venv1/Lib/site-packages/setuptools/msvc.py +12 -3
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +246 -13
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +42 -29
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +1 -1
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +93 -8
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_build_meta.py +17 -4
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_core_metadata.py +45 -0
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_egg_info.py +24 -4
- py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_sdist.py +13 -1
- py2docfx/venv/venv1/Lib/site-packages/typing_extensions.py +999 -74
- {py2docfx-0.1.15rc2025477.dist-info → py2docfx-0.1.16.dev2052678.dist-info}/METADATA +1 -1
- {py2docfx-0.1.15rc2025477.dist-info → py2docfx-0.1.16.dev2052678.dist-info}/RECORD +141 -596
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/__init__.py +0 -82
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/ado_consts.py +0 -283
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/adodbapi.py +0 -1153
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/apibase.py +0 -723
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/db_print.py +0 -72
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/db_table_names.py +0 -21
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/xls_read.py +0 -41
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/examples/xls_write.py +0 -41
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/is64bit.py +0 -34
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/process_connect_string.py +0 -137
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/schema_table.py +0 -16
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/setup.py +0 -68
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/adodbapitest.py +0 -1547
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/adodbapitestconfig.py +0 -184
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/dbapi20.py +0 -879
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/is64bit.py +0 -34
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/setuptestframework.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/test_adodbapi_dbapi20.py +0 -195
- py2docfx/venv/venv1/Lib/site-packages/adodbapi/test/tryconnection.py +0 -30
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/_parameterized.py +0 -420
- py2docfx/venv/venv1/Lib/site-packages/google/protobuf/service.py +0 -213
- py2docfx/venv/venv1/Lib/site-packages/isapi/__init__.py +0 -39
- py2docfx/venv/venv1/Lib/site-packages/isapi/install.py +0 -809
- py2docfx/venv/venv1/Lib/site-packages/isapi/isapicon.py +0 -121
- py2docfx/venv/venv1/Lib/site-packages/isapi/samples/advanced.py +0 -218
- py2docfx/venv/venv1/Lib/site-packages/isapi/samples/redirector.py +0 -116
- py2docfx/venv/venv1/Lib/site-packages/isapi/samples/redirector_asynch.py +0 -85
- py2docfx/venv/venv1/Lib/site-packages/isapi/samples/redirector_with_filter.py +0 -162
- py2docfx/venv/venv1/Lib/site-packages/isapi/samples/test.py +0 -195
- py2docfx/venv/venv1/Lib/site-packages/isapi/simple.py +0 -73
- py2docfx/venv/venv1/Lib/site-packages/isapi/test/extension_simple.py +0 -114
- py2docfx/venv/venv1/Lib/site-packages/isapi/threaded_extension.py +0 -191
- py2docfx/venv/venv1/Lib/site-packages/portalocker/__about__.py +0 -6
- py2docfx/venv/venv1/Lib/site-packages/portalocker/__init__.py +0 -79
- py2docfx/venv/venv1/Lib/site-packages/portalocker/__main__.py +0 -122
- py2docfx/venv/venv1/Lib/site-packages/portalocker/constants.py +0 -59
- py2docfx/venv/venv1/Lib/site-packages/portalocker/exceptions.py +0 -27
- py2docfx/venv/venv1/Lib/site-packages/portalocker/portalocker.py +0 -154
- py2docfx/venv/venv1/Lib/site-packages/portalocker/redis.py +0 -236
- py2docfx/venv/venv1/Lib/site-packages/portalocker/utils.py +0 -569
- py2docfx/venv/venv1/Lib/site-packages/pythoncom.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/basictimerapp.py +0 -258
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/customprint.py +0 -183
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/demoutils.py +0 -63
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/dlgappdemo.py +0 -51
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/dojobapp.py +0 -71
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/app/helloapp.py +0 -53
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/cmdserver.py +0 -113
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/createwin.py +0 -114
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/demoutils.py +0 -65
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/dibdemo.py +0 -73
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/dlgtest.py +0 -145
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/dyndlg.py +0 -104
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/fontdemo.py +0 -85
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/guidemo.py +0 -53
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/hiertest.py +0 -138
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/menutest.py +0 -13
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/objdoc.py +0 -57
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/demoutils.py +0 -63
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/flash.py +0 -95
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/msoffice.py +0 -159
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/ocxserialtest.py +0 -132
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/ocxtest.py +0 -243
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/ocx/webbrowser.py +0 -72
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/openGLDemo.py +0 -415
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/progressbar.py +0 -105
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/sliderdemo.py +0 -76
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/splittst.py +0 -79
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/threadedgui.py +0 -189
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/Demos/toolbar.py +0 -105
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/__init__.py +0 -3
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/__init__.py +0 -133
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/configui.py +0 -34
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/dbgcon.py +0 -31
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/dbgpyapp.py +0 -48
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/debugger.py +0 -1097
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/debugger/fail.py +0 -54
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/ideoptions.py +0 -136
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/list.py +0 -146
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/login.py +0 -155
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/dialogs/status.py +0 -242
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/docking/DockingBar.py +0 -676
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/docking/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/app.py +0 -411
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/bitmap.py +0 -168
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/cmdline.py +0 -54
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/dbgcommands.py +0 -188
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/dlgappcore.py +0 -76
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/ModuleBrowser.py +0 -235
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/__init__.py +0 -105
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/color/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/color/coloreditor.py +0 -646
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/configui.py +0 -299
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/document.py +0 -379
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/editor.py +0 -511
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/frame.py +0 -74
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/template.py +0 -59
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/editor/vss.py +0 -104
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/help.py +0 -173
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/interact.py +0 -995
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/intpyapp.py +0 -552
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/intpydde.py +0 -65
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/scriptutils.py +0 -684
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/sgrepmdi.py +0 -749
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/startup.py +0 -70
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/stdin.py +0 -172
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/toolmenu.py +0 -279
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/window.py +0 -14
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/framework/winout.py +0 -589
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/AutoExpand.py +0 -95
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/AutoIndent.py +0 -536
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/CallTips.py +0 -216
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/FormatParagraph.py +0 -166
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/IdleHistory.py +0 -87
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/PyParse.py +0 -585
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/idle/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/activex.py +0 -79
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/afxres.py +0 -501
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/dialog.py +0 -277
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/docview.py +0 -151
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/object.py +0 -66
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/thread.py +0 -25
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/mfc/window.py +0 -50
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/IDLEenvironment.py +0 -593
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/bindings.py +0 -180
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/config.py +0 -363
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/configui.py +0 -291
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/control.py +0 -565
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/document.py +0 -312
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/find.py +0 -511
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/formatter.py +0 -704
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/keycodes.py +0 -190
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/scintillacon.py +0 -3083
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/scintilla/view.py +0 -841
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/TraceCollector.py +0 -79
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/browseProjects.py +0 -323
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/browser.py +0 -494
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/hierlist.py +0 -353
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/regedit.py +0 -382
- py2docfx/venv/venv1/Lib/site-packages/pythonwin/pywin/tools/regpy.py +0 -80
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/BackupRead_BackupWrite.py +0 -119
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/BackupSeek_streamheaders.py +0 -137
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/CopyFileEx.py +0 -57
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/CreateFileTransacted_MiniVersion.py +0 -122
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/EvtFormatMessage.py +0 -83
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/EvtSubscribe_pull.py +0 -28
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/EvtSubscribe_push.py +0 -32
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/FileSecurityTest.py +0 -137
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/GetSaveFileName.py +0 -43
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/NetValidatePasswordPolicy.py +0 -127
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/OpenEncryptedFileRaw.py +0 -66
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/RegCreateKeyTransacted.py +0 -60
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/RegRestoreKey.py +0 -71
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/SystemParametersInfo.py +0 -210
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/c_extension/setup.py +0 -26
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/dde/ddeclient.py +0 -18
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/dde/ddeserver.py +0 -42
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/desktopmanager.py +0 -246
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/eventLogDemo.py +0 -143
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/getfilever.py +0 -33
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/mmapfile_demo.py +0 -101
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/pipes/cat.py +0 -17
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/pipes/runproc.py +0 -114
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/print_desktop.py +0 -113
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/rastest.py +0 -166
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/GetTokenInformation.py +0 -110
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/account_rights.py +0 -49
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/explicit_entries.py +0 -170
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/get_policy_info.py +0 -39
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/list_rights.py +0 -35
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/localized_names.py +0 -70
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/lsaregevent.py +0 -14
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/lsastore.py +0 -12
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/query_information.py +0 -25
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/regsave_sa.py +0 -61
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/regsecurity.py +0 -36
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sa_inherit.py +0 -8
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/security_enums.py +0 -336
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/set_file_audit.py +0 -106
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/set_file_owner.py +0 -73
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/set_policy_info.py +0 -25
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setkernelobjectsecurity.py +0 -134
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setnamedsecurityinfo.py +0 -131
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setsecurityinfo.py +0 -131
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/setuserobjectsecurity.py +0 -102
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/fetch_url.py +0 -158
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/simple_auth.py +0 -72
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/socket_server.py +0 -199
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/security/sspi/validate_password.py +0 -41
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/nativePipeTestService.py +0 -63
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/pipeTestService.py +0 -185
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/pipeTestServiceClient.py +0 -158
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/service/serviceEvents.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/timer_demo.py +0 -72
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32clipboardDemo.py +0 -155
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32clipboard_bitmapdemo.py +0 -117
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32comport_demo.py +0 -174
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32console_demo.py +0 -132
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32cred_demo.py +0 -82
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32fileDemo.py +0 -41
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_demo.py +0 -177
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_devicenotify.py +0 -106
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_dialog.py +0 -445
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_menu.py +0 -464
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32gui_taskbar.py +0 -136
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32netdemo.py +0 -272
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32rcparser_demo.py +0 -86
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32servicedemo.py +0 -23
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32ts_logoff_disconnected.py +0 -25
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32wnet/testwnet.py +0 -123
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/win32wnet/winnetwk.py +0 -100
- py2docfx/venv/venv1/Lib/site-packages/win32/Demos/winprocess.py +0 -230
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/_win32verstamp_pywin32ctypes.py +0 -164
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/afxres.py +0 -8
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/commctrl.py +0 -1551
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/mmsystem.py +0 -956
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/netbios.py +0 -293
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/ntsecuritycon.py +0 -731
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/pywin32_bootstrap.py +0 -21
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/pywin32_testutil.py +0 -291
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/pywintypes.py +0 -124
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/rasutil.py +0 -40
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/regcheck.py +0 -161
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/regutil.py +0 -395
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/sspi.py +0 -413
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/sspicon.py +0 -477
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win2kras.py +0 -14
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32con.py +0 -5064
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32cryptcon.py +0 -1922
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32evtlogutil.py +0 -225
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32gui_struct.py +0 -957
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32inetcon.py +0 -1086
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32netcon.py +0 -627
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32pdhquery.py +0 -570
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32pdhutil.py +0 -212
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32rcparser.py +0 -674
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32serviceutil.py +0 -1073
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32timezone.py +0 -1201
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32traceutil.py +0 -59
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/win32verstamp.py +0 -235
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/winerror.py +0 -7362
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/winioctlcon.py +0 -1079
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/winnt.py +0 -1347
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/winperf.py +0 -236
- py2docfx/venv/venv1/Lib/site-packages/win32/lib/winxptheme.py +0 -8
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/ControlService.py +0 -594
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/VersionStamp/BrandProject.py +0 -97
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/VersionStamp/bulkstamp.py +0 -156
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/VersionStamp/vssutil.py +0 -201
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/backupEventLog.py +0 -46
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/h2py.py +0 -194
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/killProcName.py +0 -62
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/pywin32_postinstall.py +0 -733
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/pywin32_testall.py +0 -120
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/rasutil.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/regsetup.py +0 -607
- py2docfx/venv/venv1/Lib/site-packages/win32/scripts/setup_d.py +0 -111
- py2docfx/venv/venv1/Lib/site-packages/win32/test/handles.py +0 -175
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_clipboard.py +0 -137
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_exceptions.py +0 -213
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_odbc.py +0 -264
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_pywintypes.py +0 -111
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_security.py +0 -166
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_sspi.py +0 -229
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32api.py +0 -273
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32clipboard.py +0 -59
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32cred.py +0 -91
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32crypt.py +0 -144
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32event.py +0 -119
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32file.py +0 -1096
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32gui.py +0 -227
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32guistruct.py +0 -333
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32inet.py +0 -108
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32net.py +0 -23
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32pipe.py +0 -148
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32print.py +0 -24
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32profile.py +0 -19
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32rcparser.py +0 -70
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32timezone.py +0 -16
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32trace.py +0 -366
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32ts.py +0 -19
- py2docfx/venv/venv1/Lib/site-packages/win32/test/test_win32wnet.py +0 -174
- py2docfx/venv/venv1/Lib/site-packages/win32/test/testall.py +0 -223
- py2docfx/venv/venv1/Lib/site-packages/win32/winxpgui.py +0 -13
- py2docfx/venv/venv1/Lib/site-packages/win32com/__init__.py +0 -134
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/CLSIDToClass.py +0 -60
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/__init__.py +0 -717
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/build.py +0 -771
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/combrowse.py +0 -604
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/connect.py +0 -48
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/dynamic.py +0 -699
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/gencache.py +0 -825
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/genpy.py +0 -1350
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/makepy.py +0 -453
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/selecttlb.py +0 -182
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/tlbrowse.py +0 -277
- py2docfx/venv/venv1/Lib/site-packages/win32com/client/util.py +0 -103
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/connect.py +0 -96
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/dump_clipboard.py +0 -74
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/eventsApartmentThreaded.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/eventsFreeThreaded.py +0 -92
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/excelAddin.py +0 -169
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/excelRTDServer.py +0 -434
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/iebutton.py +0 -214
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/ietoolbar.py +0 -368
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/outlookAddin.py +0 -135
- py2docfx/venv/venv1/Lib/site-packages/win32com/demos/trybag.py +0 -78
- py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/makegw.py +0 -618
- py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/makegwenum.py +0 -331
- py2docfx/venv/venv1/Lib/site-packages/win32com/makegw/makegwparse.py +0 -1017
- py2docfx/venv/venv1/Lib/site-packages/win32com/olectl.py +0 -70
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/connect.py +0 -85
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/dispatcher.py +0 -239
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/exception.py +0 -99
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/factory.py +0 -26
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/localserver.py +0 -53
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/policy.py +0 -803
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/register.py +0 -677
- py2docfx/venv/venv1/Lib/site-packages/win32com/server/util.py +0 -229
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/PythonTools.py +0 -47
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/dictionary.py +0 -133
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/interp.py +0 -59
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/perfmon.py +0 -36
- py2docfx/venv/venv1/Lib/site-packages/win32com/servers/test_pycomtest.py +0 -181
- py2docfx/venv/venv1/Lib/site-packages/win32com/storagecon.py +0 -142
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/GenTestScripts.py +0 -95
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/daodump.py +0 -88
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/errorSemantics.py +0 -243
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/pippo_server.py +0 -96
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/policySemantics.py +0 -115
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testADOEvents.py +0 -100
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testAXScript.py +0 -44
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testAccess.py +0 -185
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testArrays.py +0 -99
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testClipboard.py +0 -169
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testCollections.py +0 -159
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testConversionErrors.py +0 -35
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDCOM.py +0 -50
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDates.py +0 -74
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDictionary.py +0 -101
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testDynamic.py +0 -83
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testExchange.py +0 -121
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testExplorer.py +0 -139
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testGIT.py +0 -142
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testGatewayAddresses.py +0 -149
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testIterators.py +0 -140
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testMSOffice.py +0 -184
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testMSOfficeEvents.py +0 -138
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testMarshal.py +0 -160
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testPersist.py +0 -227
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testPippo.py +0 -80
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testPyComTest.py +0 -918
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testROT.py +0 -29
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testServers.py +0 -51
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testShell.py +0 -272
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testStorage.py +0 -88
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testStreams.py +0 -147
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testWMI.py +0 -18
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testall.py +0 -320
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testmakepy.py +0 -54
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testvb.py +0 -583
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testvbscript_regexp.py +0 -40
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/testxslt.py +0 -34
- py2docfx/venv/venv1/Lib/site-packages/win32com/test/util.py +0 -262
- py2docfx/venv/venv1/Lib/site-packages/win32com/universal.py +0 -224
- py2docfx/venv/venv1/Lib/site-packages/win32com/util.py +0 -35
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/__init__.py +0 -113
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/adsicon.py +0 -340
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/objectPicker.py +0 -68
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/scp.py +0 -565
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/search.py +0 -151
- py2docfx/venv/venv1/Lib/site-packages/win32comext/adsi/demos/test.py +0 -274
- py2docfx/venv/venv1/Lib/site-packages/win32comext/authorization/__init__.py +0 -6
- py2docfx/venv/venv1/Lib/site-packages/win32comext/authorization/demos/EditSecurity.py +0 -229
- py2docfx/venv/venv1/Lib/site-packages/win32comext/authorization/demos/EditServiceSecurity.py +0 -219
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axcontrol/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/adb.py +0 -467
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/codecontainer.py +0 -279
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/contexts.py +0 -58
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/debugger.py +0 -238
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/documents.py +0 -135
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/dump.py +0 -57
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/expressions.py +0 -212
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/gateways.py +0 -583
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/stackframe.py +0 -178
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axdebug/util.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/asputil.py +0 -13
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/debug.py +0 -223
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/error.py +0 -262
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/framework.py +0 -1291
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/pydumper.py +0 -78
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/pyscript.py +0 -438
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/pyscript_rexec.py +0 -54
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/client/scriptdispatch.py +0 -103
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/server/__init__.py +0 -0
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/server/axsite.py +0 -145
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/test/leakTest.py +0 -185
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/test/testHost.py +0 -240
- py2docfx/venv/venv1/Lib/site-packages/win32comext/axscript/test/testHost4Dbg.py +0 -83
- py2docfx/venv/venv1/Lib/site-packages/win32comext/bits/__init__.py +0 -6
- py2docfx/venv/venv1/Lib/site-packages/win32comext/bits/test/show_all_jobs.py +0 -48
- py2docfx/venv/venv1/Lib/site-packages/win32comext/bits/test/test_bits.py +0 -119
- py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/test/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/test/ds_record.py +0 -60
- py2docfx/venv/venv1/Lib/site-packages/win32comext/directsound/test/ds_test.py +0 -402
- py2docfx/venv/venv1/Lib/site-packages/win32comext/ifilter/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32comext/ifilter/demo/filterDemo.py +0 -300
- py2docfx/venv/venv1/Lib/site-packages/win32comext/ifilter/ifiltercon.py +0 -110
- py2docfx/venv/venv1/Lib/site-packages/win32comext/internet/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/internet/inetcon.py +0 -261
- py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/__init__.py +0 -21
- py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/demos/mapisend.py +0 -98
- py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/emsabtags.py +0 -875
- py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/mapitags.py +0 -1023
- py2docfx/venv/venv1/Lib/site-packages/win32comext/mapi/mapiutil.py +0 -211
- py2docfx/venv/venv1/Lib/site-packages/win32comext/propsys/__init__.py +0 -1
- py2docfx/venv/venv1/Lib/site-packages/win32comext/propsys/pscon.py +0 -838
- py2docfx/venv/venv1/Lib/site-packages/win32comext/propsys/test/testpropsys.py +0 -5
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/__init__.py +0 -4
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IActiveDesktop.py +0 -83
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IFileOperationProgressSink.py +0 -179
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IShellLinkDataList.py +0 -67
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/ITransferAdviseSink.py +0 -93
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/IUniformResourceLocator.py +0 -56
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/browse_for_folder.py +0 -45
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/create_link.py +0 -73
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/dump_link.py +0 -58
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/explorer_browser.py +0 -143
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/column_provider.py +0 -125
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/context_menu.py +0 -122
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/copy_hook.py +0 -84
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/empty_volume_cache.py +0 -188
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/folder_view.py +0 -866
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/icon_handler.py +0 -81
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/servers/shell_view.py +0 -971
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/shellexecuteex.py +0 -19
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/viewstate.py +0 -68
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/demos/walk_shell_folders.py +0 -24
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/shellcon.py +0 -1615
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/test/testSHFileOperation.py +0 -75
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/test/testShellFolder.py +0 -21
- py2docfx/venv/venv1/Lib/site-packages/win32comext/shell/test/testShellItem.py +0 -69
- py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/__init__.py +0 -6
- py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_addtask.py +0 -66
- py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_addtask_1.py +0 -68
- py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_addtask_2.py +0 -49
- py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_localsystem.py +0 -3
- py2docfx/venv/venv1/Scripts/pywin32_postinstall.py +0 -733
- py2docfx/venv/venv1/Scripts/pywin32_testall.py +0 -120
- {py2docfx-0.1.15rc2025477.dist-info → py2docfx-0.1.16.dev2052678.dist-info}/WHEEL +0 -0
- {py2docfx-0.1.15rc2025477.dist-info → py2docfx-0.1.16.dev2052678.dist-info}/top_level.txt +0 -0
@@ -1,1073 +0,0 @@
|
|
1
|
-
# General purpose service utilities, both for standard Python scripts,
|
2
|
-
# and for for Python programs which run as services...
|
3
|
-
#
|
4
|
-
# Note that most utility functions here will raise win32api.error's
|
5
|
-
# (which is win32service.error, pywintypes.error, etc)
|
6
|
-
# when things go wrong - eg, not enough permissions to hit the
|
7
|
-
# registry etc.
|
8
|
-
|
9
|
-
import importlib.machinery
|
10
|
-
import os
|
11
|
-
import sys
|
12
|
-
import warnings
|
13
|
-
|
14
|
-
import pywintypes
|
15
|
-
import win32api
|
16
|
-
import win32con
|
17
|
-
import win32service
|
18
|
-
import winerror
|
19
|
-
|
20
|
-
error = RuntimeError # Re-exported alias
|
21
|
-
|
22
|
-
|
23
|
-
# Returns the full path to an executable for hosting a Python service - typically
|
24
|
-
# 'pythonservice.exe'
|
25
|
-
# * If you pass a param and it exists as a file, you'll get the abs path back
|
26
|
-
# * Otherwise we'll use the param instead of 'pythonservice.exe', and we will
|
27
|
-
# look for it.
|
28
|
-
def LocatePythonServiceExe(exe=None):
|
29
|
-
if not exe and hasattr(sys, "frozen"):
|
30
|
-
# If py2exe etc calls this with no exe, default is current exe,
|
31
|
-
# and all setup is their problem :)
|
32
|
-
return sys.executable
|
33
|
-
|
34
|
-
if exe and os.path.isfile(exe):
|
35
|
-
return win32api.GetFullPathName(exe)
|
36
|
-
|
37
|
-
suffix = "_d" if "_d.pyd" in importlib.machinery.EXTENSION_SUFFIXES else ""
|
38
|
-
|
39
|
-
# We are confused if we aren't now looking for our default. But if that
|
40
|
-
# exists as specified we assume it's good.
|
41
|
-
exe = f"pythonservice{suffix}.exe"
|
42
|
-
if os.path.isfile(exe):
|
43
|
-
return win32api.GetFullPathName(exe)
|
44
|
-
|
45
|
-
# Now we are searching for the .exe
|
46
|
-
# We are going to want it here.
|
47
|
-
correct = os.path.join(sys.exec_prefix, exe)
|
48
|
-
# Even if that file already exists, we copy the one installed by pywin32
|
49
|
-
# in-case it was upgraded.
|
50
|
-
# pywin32 installed it next to win32service.pyd (but we can't run it from there)
|
51
|
-
maybe = os.path.join(os.path.dirname(win32service.__file__), exe)
|
52
|
-
if os.path.exists(maybe):
|
53
|
-
print(f"moving host exe '{maybe}' -> '{correct}'")
|
54
|
-
# Handle case where MoveFile() fails. Particularly if destination file
|
55
|
-
# has a resource lock and can't be replaced by src file
|
56
|
-
try:
|
57
|
-
win32api.MoveFileEx(maybe, correct, win32con.MOVEFILE_REPLACE_EXISTING)
|
58
|
-
except win32api.error as exc:
|
59
|
-
print(f"Failed to move host exe '{exc}'")
|
60
|
-
|
61
|
-
if not os.path.exists(correct):
|
62
|
-
raise error(f"Can't find '{correct}'")
|
63
|
-
|
64
|
-
# If pywintypes.dll isn't next to us, or at least next to pythonXX.dll,
|
65
|
-
# there's a good chance the service will not run. That's usually copied by
|
66
|
-
# `pywin32_postinstall`, but putting it next to the python DLL seems reasonable.
|
67
|
-
# (Unlike the .exe above, we don't unconditionally copy this, and possibly
|
68
|
-
# copy it to a different place. Doesn't seem a good reason for that!?)
|
69
|
-
python_dll = win32api.GetModuleFileName(sys.dllhandle)
|
70
|
-
pyw = f"pywintypes{sys.version_info.major}{sys.version_info.minor}{suffix}.dll"
|
71
|
-
correct_pyw = os.path.join(os.path.dirname(python_dll), pyw)
|
72
|
-
|
73
|
-
if not os.path.exists(correct_pyw):
|
74
|
-
print(f"copying helper dll '{pywintypes.__file__}' -> '{correct_pyw}'")
|
75
|
-
win32api.CopyFile(pywintypes.__file__, correct_pyw)
|
76
|
-
|
77
|
-
return correct
|
78
|
-
|
79
|
-
|
80
|
-
def _GetServiceShortName(longName):
|
81
|
-
# looks up a services name
|
82
|
-
# from the display name
|
83
|
-
# Thanks to Andy McKay for this code.
|
84
|
-
access = (
|
85
|
-
win32con.KEY_READ | win32con.KEY_ENUMERATE_SUB_KEYS | win32con.KEY_QUERY_VALUE
|
86
|
-
)
|
87
|
-
hkey = win32api.RegOpenKey(
|
88
|
-
win32con.HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services", 0, access
|
89
|
-
)
|
90
|
-
num = win32api.RegQueryInfoKey(hkey)[0]
|
91
|
-
longName = longName.lower()
|
92
|
-
# loop through number of subkeys
|
93
|
-
for x in range(0, num):
|
94
|
-
# find service name, open subkey
|
95
|
-
svc = win32api.RegEnumKey(hkey, x)
|
96
|
-
skey = win32api.RegOpenKey(hkey, svc, 0, access)
|
97
|
-
try:
|
98
|
-
# find display name
|
99
|
-
thisName = str(win32api.RegQueryValueEx(skey, "DisplayName")[0])
|
100
|
-
if thisName.lower() == longName:
|
101
|
-
return svc
|
102
|
-
except win32api.error:
|
103
|
-
# in case there is no key called DisplayName
|
104
|
-
pass
|
105
|
-
return None
|
106
|
-
|
107
|
-
|
108
|
-
# Open a service given either it's long or short name.
|
109
|
-
def SmartOpenService(hscm, name, access):
|
110
|
-
try:
|
111
|
-
return win32service.OpenService(hscm, name, access)
|
112
|
-
except win32api.error as details:
|
113
|
-
if details.winerror not in [
|
114
|
-
winerror.ERROR_SERVICE_DOES_NOT_EXIST,
|
115
|
-
winerror.ERROR_INVALID_NAME,
|
116
|
-
]:
|
117
|
-
raise
|
118
|
-
name = win32service.GetServiceKeyName(hscm, name)
|
119
|
-
return win32service.OpenService(hscm, name, access)
|
120
|
-
|
121
|
-
|
122
|
-
def LocateSpecificServiceExe(serviceName):
|
123
|
-
# Return the .exe name of any service.
|
124
|
-
hkey = win32api.RegOpenKey(
|
125
|
-
win32con.HKEY_LOCAL_MACHINE,
|
126
|
-
"SYSTEM\\CurrentControlSet\\Services\\%s" % (serviceName),
|
127
|
-
0,
|
128
|
-
win32con.KEY_QUERY_VALUE,
|
129
|
-
)
|
130
|
-
try:
|
131
|
-
return win32api.RegQueryValueEx(hkey, "ImagePath")[0]
|
132
|
-
finally:
|
133
|
-
hkey.Close()
|
134
|
-
|
135
|
-
|
136
|
-
def InstallPerfmonForService(serviceName, iniName, dllName=None):
|
137
|
-
# If no DLL name, look it up in the INI file name
|
138
|
-
if not dllName: # May be empty string!
|
139
|
-
dllName = win32api.GetProfileVal("Python", "dll", "", iniName)
|
140
|
-
# Still not found - look for the standard one in the same dir as win32service.pyd
|
141
|
-
if not dllName:
|
142
|
-
try:
|
143
|
-
tryName = os.path.join(
|
144
|
-
os.path.split(win32service.__file__)[0], "perfmondata.dll"
|
145
|
-
)
|
146
|
-
if os.path.isfile(tryName):
|
147
|
-
dllName = tryName
|
148
|
-
except AttributeError:
|
149
|
-
# Frozen app? - anyway, can't find it!
|
150
|
-
pass
|
151
|
-
if not dllName:
|
152
|
-
raise ValueError("The name of the performance DLL must be available")
|
153
|
-
dllName = win32api.GetFullPathName(dllName)
|
154
|
-
# Now setup all the required "Performance" entries.
|
155
|
-
hkey = win32api.RegOpenKey(
|
156
|
-
win32con.HKEY_LOCAL_MACHINE,
|
157
|
-
"SYSTEM\\CurrentControlSet\\Services\\%s" % (serviceName),
|
158
|
-
0,
|
159
|
-
win32con.KEY_ALL_ACCESS,
|
160
|
-
)
|
161
|
-
try:
|
162
|
-
subKey = win32api.RegCreateKey(hkey, "Performance")
|
163
|
-
try:
|
164
|
-
win32api.RegSetValueEx(subKey, "Library", 0, win32con.REG_SZ, dllName)
|
165
|
-
win32api.RegSetValueEx(
|
166
|
-
subKey, "Open", 0, win32con.REG_SZ, "OpenPerformanceData"
|
167
|
-
)
|
168
|
-
win32api.RegSetValueEx(
|
169
|
-
subKey, "Close", 0, win32con.REG_SZ, "ClosePerformanceData"
|
170
|
-
)
|
171
|
-
win32api.RegSetValueEx(
|
172
|
-
subKey, "Collect", 0, win32con.REG_SZ, "CollectPerformanceData"
|
173
|
-
)
|
174
|
-
finally:
|
175
|
-
win32api.RegCloseKey(subKey)
|
176
|
-
finally:
|
177
|
-
win32api.RegCloseKey(hkey)
|
178
|
-
# Now do the "Lodctr" thang...
|
179
|
-
|
180
|
-
try:
|
181
|
-
import perfmon
|
182
|
-
|
183
|
-
path, fname = os.path.split(iniName)
|
184
|
-
oldPath = os.getcwd()
|
185
|
-
if path:
|
186
|
-
os.chdir(path)
|
187
|
-
try:
|
188
|
-
perfmon.LoadPerfCounterTextStrings("python.exe " + fname)
|
189
|
-
finally:
|
190
|
-
os.chdir(oldPath)
|
191
|
-
except win32api.error as details:
|
192
|
-
print("The service was installed OK, but the performance monitor")
|
193
|
-
print("data could not be loaded.", details)
|
194
|
-
|
195
|
-
|
196
|
-
def _GetCommandLine(exeName, exeArgs):
|
197
|
-
if exeArgs is not None:
|
198
|
-
return exeName + " " + exeArgs
|
199
|
-
else:
|
200
|
-
return exeName
|
201
|
-
|
202
|
-
|
203
|
-
def InstallService(
|
204
|
-
pythonClassString,
|
205
|
-
serviceName,
|
206
|
-
displayName,
|
207
|
-
startType=None,
|
208
|
-
errorControl=None,
|
209
|
-
bRunInteractive=0,
|
210
|
-
serviceDeps=None,
|
211
|
-
userName=None,
|
212
|
-
password=None,
|
213
|
-
exeName=None,
|
214
|
-
perfMonIni=None,
|
215
|
-
perfMonDll=None,
|
216
|
-
exeArgs=None,
|
217
|
-
description=None,
|
218
|
-
delayedstart=None,
|
219
|
-
):
|
220
|
-
# Handle the default arguments.
|
221
|
-
if startType is None:
|
222
|
-
startType = win32service.SERVICE_DEMAND_START
|
223
|
-
serviceType = win32service.SERVICE_WIN32_OWN_PROCESS
|
224
|
-
if bRunInteractive:
|
225
|
-
serviceType |= win32service.SERVICE_INTERACTIVE_PROCESS
|
226
|
-
if errorControl is None:
|
227
|
-
errorControl = win32service.SERVICE_ERROR_NORMAL
|
228
|
-
|
229
|
-
exeName = '"%s"' % LocatePythonServiceExe(exeName)
|
230
|
-
commandLine = _GetCommandLine(exeName, exeArgs)
|
231
|
-
hscm = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS)
|
232
|
-
try:
|
233
|
-
hs = win32service.CreateService(
|
234
|
-
hscm,
|
235
|
-
serviceName,
|
236
|
-
displayName,
|
237
|
-
win32service.SERVICE_ALL_ACCESS, # desired access
|
238
|
-
serviceType, # service type
|
239
|
-
startType,
|
240
|
-
errorControl, # error control type
|
241
|
-
commandLine,
|
242
|
-
None,
|
243
|
-
0,
|
244
|
-
serviceDeps,
|
245
|
-
userName,
|
246
|
-
password,
|
247
|
-
)
|
248
|
-
if description is not None:
|
249
|
-
try:
|
250
|
-
win32service.ChangeServiceConfig2(
|
251
|
-
hs, win32service.SERVICE_CONFIG_DESCRIPTION, description
|
252
|
-
)
|
253
|
-
except NotImplementedError:
|
254
|
-
pass ## ChangeServiceConfig2 and description do not exist on NT
|
255
|
-
if delayedstart is not None:
|
256
|
-
try:
|
257
|
-
win32service.ChangeServiceConfig2(
|
258
|
-
hs,
|
259
|
-
win32service.SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
|
260
|
-
delayedstart,
|
261
|
-
)
|
262
|
-
except (win32service.error, NotImplementedError):
|
263
|
-
## delayed start only exists on Vista and later - warn only when trying to set delayed to True
|
264
|
-
warnings.warn("Delayed Start not available on this system")
|
265
|
-
win32service.CloseServiceHandle(hs)
|
266
|
-
finally:
|
267
|
-
win32service.CloseServiceHandle(hscm)
|
268
|
-
InstallPythonClassString(pythonClassString, serviceName)
|
269
|
-
# If I have performance monitor info to install, do that.
|
270
|
-
if perfMonIni is not None:
|
271
|
-
InstallPerfmonForService(serviceName, perfMonIni, perfMonDll)
|
272
|
-
|
273
|
-
|
274
|
-
def ChangeServiceConfig(
|
275
|
-
pythonClassString,
|
276
|
-
serviceName,
|
277
|
-
startType=None,
|
278
|
-
errorControl=None,
|
279
|
-
bRunInteractive=0,
|
280
|
-
serviceDeps=None,
|
281
|
-
userName=None,
|
282
|
-
password=None,
|
283
|
-
exeName=None,
|
284
|
-
displayName=None,
|
285
|
-
perfMonIni=None,
|
286
|
-
perfMonDll=None,
|
287
|
-
exeArgs=None,
|
288
|
-
description=None,
|
289
|
-
delayedstart=None,
|
290
|
-
):
|
291
|
-
# Before doing anything, remove any perfmon counters.
|
292
|
-
try:
|
293
|
-
import perfmon
|
294
|
-
|
295
|
-
perfmon.UnloadPerfCounterTextStrings("python.exe " + serviceName)
|
296
|
-
except (ImportError, win32api.error):
|
297
|
-
pass
|
298
|
-
|
299
|
-
# The EXE location may have changed
|
300
|
-
exeName = '"%s"' % LocatePythonServiceExe(exeName)
|
301
|
-
|
302
|
-
# Handle the default arguments.
|
303
|
-
if startType is None:
|
304
|
-
startType = win32service.SERVICE_NO_CHANGE
|
305
|
-
if errorControl is None:
|
306
|
-
errorControl = win32service.SERVICE_NO_CHANGE
|
307
|
-
|
308
|
-
hscm = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS)
|
309
|
-
serviceType = win32service.SERVICE_WIN32_OWN_PROCESS
|
310
|
-
if bRunInteractive:
|
311
|
-
serviceType |= win32service.SERVICE_INTERACTIVE_PROCESS
|
312
|
-
commandLine = _GetCommandLine(exeName, exeArgs)
|
313
|
-
try:
|
314
|
-
hs = SmartOpenService(hscm, serviceName, win32service.SERVICE_ALL_ACCESS)
|
315
|
-
try:
|
316
|
-
win32service.ChangeServiceConfig(
|
317
|
-
hs,
|
318
|
-
serviceType, # service type
|
319
|
-
startType,
|
320
|
-
errorControl, # error control type
|
321
|
-
commandLine,
|
322
|
-
None,
|
323
|
-
0,
|
324
|
-
serviceDeps,
|
325
|
-
userName,
|
326
|
-
password,
|
327
|
-
displayName,
|
328
|
-
)
|
329
|
-
if description is not None:
|
330
|
-
try:
|
331
|
-
win32service.ChangeServiceConfig2(
|
332
|
-
hs, win32service.SERVICE_CONFIG_DESCRIPTION, description
|
333
|
-
)
|
334
|
-
except NotImplementedError:
|
335
|
-
pass ## ChangeServiceConfig2 and description do not exist on NT
|
336
|
-
if delayedstart is not None:
|
337
|
-
try:
|
338
|
-
win32service.ChangeServiceConfig2(
|
339
|
-
hs,
|
340
|
-
win32service.SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
|
341
|
-
delayedstart,
|
342
|
-
)
|
343
|
-
except (win32service.error, NotImplementedError):
|
344
|
-
## Delayed start only exists on Vista and later. On Nt, will raise NotImplementedError since ChangeServiceConfig2
|
345
|
-
## doensn't exist. On Win2k and XP, will fail with ERROR_INVALID_LEVEL
|
346
|
-
## Warn only if trying to set delayed to True
|
347
|
-
if delayedstart:
|
348
|
-
warnings.warn("Delayed Start not available on this system")
|
349
|
-
finally:
|
350
|
-
win32service.CloseServiceHandle(hs)
|
351
|
-
finally:
|
352
|
-
win32service.CloseServiceHandle(hscm)
|
353
|
-
InstallPythonClassString(pythonClassString, serviceName)
|
354
|
-
# If I have performance monitor info to install, do that.
|
355
|
-
if perfMonIni is not None:
|
356
|
-
InstallPerfmonForService(serviceName, perfMonIni, perfMonDll)
|
357
|
-
|
358
|
-
|
359
|
-
def InstallPythonClassString(pythonClassString, serviceName):
|
360
|
-
# Now setup our Python specific entries.
|
361
|
-
if pythonClassString:
|
362
|
-
key = win32api.RegCreateKey(
|
363
|
-
win32con.HKEY_LOCAL_MACHINE,
|
364
|
-
"System\\CurrentControlSet\\Services\\%s\\PythonClass" % serviceName,
|
365
|
-
)
|
366
|
-
try:
|
367
|
-
win32api.RegSetValue(key, None, win32con.REG_SZ, pythonClassString)
|
368
|
-
finally:
|
369
|
-
win32api.RegCloseKey(key)
|
370
|
-
|
371
|
-
|
372
|
-
# Utility functions for Services, to allow persistant properties.
|
373
|
-
def SetServiceCustomOption(serviceName, option, value):
|
374
|
-
try:
|
375
|
-
serviceName = serviceName._svc_name_
|
376
|
-
except AttributeError:
|
377
|
-
pass
|
378
|
-
key = win32api.RegCreateKey(
|
379
|
-
win32con.HKEY_LOCAL_MACHINE,
|
380
|
-
"System\\CurrentControlSet\\Services\\%s\\Parameters" % serviceName,
|
381
|
-
)
|
382
|
-
try:
|
383
|
-
if isinstance(value, int):
|
384
|
-
win32api.RegSetValueEx(key, option, 0, win32con.REG_DWORD, value)
|
385
|
-
else:
|
386
|
-
win32api.RegSetValueEx(key, option, 0, win32con.REG_SZ, value)
|
387
|
-
finally:
|
388
|
-
win32api.RegCloseKey(key)
|
389
|
-
|
390
|
-
|
391
|
-
def GetServiceCustomOption(serviceName, option, defaultValue=None):
|
392
|
-
# First param may also be a service class/instance.
|
393
|
-
# This allows services to pass "self"
|
394
|
-
try:
|
395
|
-
serviceName = serviceName._svc_name_
|
396
|
-
except AttributeError:
|
397
|
-
pass
|
398
|
-
key = win32api.RegCreateKey(
|
399
|
-
win32con.HKEY_LOCAL_MACHINE,
|
400
|
-
"System\\CurrentControlSet\\Services\\%s\\Parameters" % serviceName,
|
401
|
-
)
|
402
|
-
try:
|
403
|
-
try:
|
404
|
-
return win32api.RegQueryValueEx(key, option)[0]
|
405
|
-
except win32api.error: # No value.
|
406
|
-
return defaultValue
|
407
|
-
finally:
|
408
|
-
win32api.RegCloseKey(key)
|
409
|
-
|
410
|
-
|
411
|
-
def RemoveService(serviceName):
|
412
|
-
try:
|
413
|
-
import perfmon
|
414
|
-
|
415
|
-
perfmon.UnloadPerfCounterTextStrings("python.exe " + serviceName)
|
416
|
-
except (ImportError, win32api.error):
|
417
|
-
pass
|
418
|
-
|
419
|
-
hscm = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS)
|
420
|
-
try:
|
421
|
-
hs = SmartOpenService(hscm, serviceName, win32service.SERVICE_ALL_ACCESS)
|
422
|
-
win32service.DeleteService(hs)
|
423
|
-
win32service.CloseServiceHandle(hs)
|
424
|
-
finally:
|
425
|
-
win32service.CloseServiceHandle(hscm)
|
426
|
-
|
427
|
-
import win32evtlogutil
|
428
|
-
|
429
|
-
try:
|
430
|
-
win32evtlogutil.RemoveSourceFromRegistry(serviceName)
|
431
|
-
except win32api.error:
|
432
|
-
pass
|
433
|
-
|
434
|
-
|
435
|
-
def ControlService(serviceName, code, machine=None):
|
436
|
-
hscm = win32service.OpenSCManager(machine, None, win32service.SC_MANAGER_ALL_ACCESS)
|
437
|
-
try:
|
438
|
-
hs = SmartOpenService(hscm, serviceName, win32service.SERVICE_ALL_ACCESS)
|
439
|
-
try:
|
440
|
-
status = win32service.ControlService(hs, code)
|
441
|
-
finally:
|
442
|
-
win32service.CloseServiceHandle(hs)
|
443
|
-
finally:
|
444
|
-
win32service.CloseServiceHandle(hscm)
|
445
|
-
return status
|
446
|
-
|
447
|
-
|
448
|
-
def __FindSvcDeps(findName):
|
449
|
-
dict = {}
|
450
|
-
k = win32api.RegOpenKey(
|
451
|
-
win32con.HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services"
|
452
|
-
)
|
453
|
-
num = 0
|
454
|
-
while 1:
|
455
|
-
try:
|
456
|
-
svc = win32api.RegEnumKey(k, num)
|
457
|
-
except win32api.error:
|
458
|
-
break
|
459
|
-
num += 1
|
460
|
-
sk = win32api.RegOpenKey(k, svc)
|
461
|
-
try:
|
462
|
-
deps, typ = win32api.RegQueryValueEx(sk, "DependOnService")
|
463
|
-
except win32api.error:
|
464
|
-
deps = ()
|
465
|
-
for dep in deps:
|
466
|
-
dep = dep.lower()
|
467
|
-
dep_on = dict.get(dep, [])
|
468
|
-
dep_on.append(svc)
|
469
|
-
dict[dep] = dep_on
|
470
|
-
|
471
|
-
return __ResolveDeps(findName, dict)
|
472
|
-
|
473
|
-
|
474
|
-
def __ResolveDeps(findName, dict):
|
475
|
-
items = dict.get(findName.lower(), [])
|
476
|
-
retList = []
|
477
|
-
for svc in items:
|
478
|
-
retList.insert(0, svc)
|
479
|
-
retList = __ResolveDeps(svc, dict) + retList
|
480
|
-
return retList
|
481
|
-
|
482
|
-
|
483
|
-
def WaitForServiceStatus(serviceName, status, waitSecs, machine=None):
|
484
|
-
"""Waits for the service to return the specified status. You
|
485
|
-
should have already requested the service to enter that state"""
|
486
|
-
for i in range(waitSecs * 4):
|
487
|
-
now_status = QueryServiceStatus(serviceName, machine)[1]
|
488
|
-
if now_status == status:
|
489
|
-
break
|
490
|
-
win32api.Sleep(250)
|
491
|
-
else:
|
492
|
-
raise pywintypes.error(
|
493
|
-
winerror.ERROR_SERVICE_REQUEST_TIMEOUT,
|
494
|
-
"QueryServiceStatus",
|
495
|
-
win32api.FormatMessage(winerror.ERROR_SERVICE_REQUEST_TIMEOUT)[:-2],
|
496
|
-
)
|
497
|
-
|
498
|
-
|
499
|
-
def __StopServiceWithTimeout(hs, waitSecs=30):
|
500
|
-
try:
|
501
|
-
status = win32service.ControlService(hs, win32service.SERVICE_CONTROL_STOP)
|
502
|
-
except pywintypes.error as exc:
|
503
|
-
if exc.winerror != winerror.ERROR_SERVICE_NOT_ACTIVE:
|
504
|
-
raise
|
505
|
-
for i in range(waitSecs):
|
506
|
-
status = win32service.QueryServiceStatus(hs)
|
507
|
-
if status[1] == win32service.SERVICE_STOPPED:
|
508
|
-
break
|
509
|
-
win32api.Sleep(1000)
|
510
|
-
else:
|
511
|
-
raise pywintypes.error(
|
512
|
-
winerror.ERROR_SERVICE_REQUEST_TIMEOUT,
|
513
|
-
"ControlService",
|
514
|
-
win32api.FormatMessage(winerror.ERROR_SERVICE_REQUEST_TIMEOUT)[:-2],
|
515
|
-
)
|
516
|
-
|
517
|
-
|
518
|
-
def StopServiceWithDeps(serviceName, machine=None, waitSecs=30):
|
519
|
-
# Stop a service recursively looking for dependant services
|
520
|
-
hscm = win32service.OpenSCManager(machine, None, win32service.SC_MANAGER_ALL_ACCESS)
|
521
|
-
try:
|
522
|
-
deps = __FindSvcDeps(serviceName)
|
523
|
-
for dep in deps:
|
524
|
-
hs = win32service.OpenService(hscm, dep, win32service.SERVICE_ALL_ACCESS)
|
525
|
-
try:
|
526
|
-
__StopServiceWithTimeout(hs, waitSecs)
|
527
|
-
finally:
|
528
|
-
win32service.CloseServiceHandle(hs)
|
529
|
-
# Now my service!
|
530
|
-
hs = win32service.OpenService(
|
531
|
-
hscm, serviceName, win32service.SERVICE_ALL_ACCESS
|
532
|
-
)
|
533
|
-
try:
|
534
|
-
__StopServiceWithTimeout(hs, waitSecs)
|
535
|
-
finally:
|
536
|
-
win32service.CloseServiceHandle(hs)
|
537
|
-
|
538
|
-
finally:
|
539
|
-
win32service.CloseServiceHandle(hscm)
|
540
|
-
|
541
|
-
|
542
|
-
def StopService(serviceName, machine=None):
|
543
|
-
return ControlService(serviceName, win32service.SERVICE_CONTROL_STOP, machine)
|
544
|
-
|
545
|
-
|
546
|
-
def StartService(serviceName, args=None, machine=None):
|
547
|
-
hscm = win32service.OpenSCManager(machine, None, win32service.SC_MANAGER_ALL_ACCESS)
|
548
|
-
try:
|
549
|
-
hs = SmartOpenService(hscm, serviceName, win32service.SERVICE_ALL_ACCESS)
|
550
|
-
try:
|
551
|
-
win32service.StartService(hs, args)
|
552
|
-
finally:
|
553
|
-
win32service.CloseServiceHandle(hs)
|
554
|
-
finally:
|
555
|
-
win32service.CloseServiceHandle(hscm)
|
556
|
-
|
557
|
-
|
558
|
-
def RestartService(serviceName, args=None, waitSeconds=30, machine=None):
|
559
|
-
"Stop the service, and then start it again (with some tolerance for allowing it to stop.)"
|
560
|
-
try:
|
561
|
-
StopService(serviceName, machine)
|
562
|
-
except pywintypes.error as exc:
|
563
|
-
# Allow only "service not running" error
|
564
|
-
if exc.winerror != winerror.ERROR_SERVICE_NOT_ACTIVE:
|
565
|
-
raise
|
566
|
-
# Give it a few goes, as the service may take time to stop
|
567
|
-
for i in range(waitSeconds):
|
568
|
-
try:
|
569
|
-
StartService(serviceName, args, machine)
|
570
|
-
break
|
571
|
-
except pywintypes.error as exc:
|
572
|
-
if exc.winerror != winerror.ERROR_SERVICE_ALREADY_RUNNING:
|
573
|
-
raise
|
574
|
-
win32api.Sleep(1000)
|
575
|
-
else:
|
576
|
-
print("Gave up waiting for the old service to stop!")
|
577
|
-
|
578
|
-
|
579
|
-
def _DebugCtrlHandler(evt):
|
580
|
-
if evt in (win32con.CTRL_C_EVENT, win32con.CTRL_BREAK_EVENT):
|
581
|
-
assert g_debugService
|
582
|
-
print("Stopping debug service.")
|
583
|
-
g_debugService.SvcStop()
|
584
|
-
return True
|
585
|
-
return False
|
586
|
-
|
587
|
-
|
588
|
-
def DebugService(cls, argv=[]):
|
589
|
-
# Run a service in "debug" mode. Re-implements what pythonservice.exe
|
590
|
-
# does when it sees a "-debug" param.
|
591
|
-
# Currently only used by "frozen" (ie, py2exe) programs (but later may
|
592
|
-
# end up being used for all services should we ever remove
|
593
|
-
# pythonservice.exe)
|
594
|
-
import servicemanager
|
595
|
-
|
596
|
-
global g_debugService
|
597
|
-
|
598
|
-
print(f"Debugging service {cls._svc_name_} - press Ctrl+C to stop.")
|
599
|
-
servicemanager.Debugging(True)
|
600
|
-
servicemanager.PrepareToHostSingle(cls)
|
601
|
-
g_debugService = cls(argv)
|
602
|
-
# Setup a ctrl+c handler to simulate a "stop"
|
603
|
-
win32api.SetConsoleCtrlHandler(_DebugCtrlHandler, True)
|
604
|
-
try:
|
605
|
-
g_debugService.SvcRun()
|
606
|
-
finally:
|
607
|
-
win32api.SetConsoleCtrlHandler(_DebugCtrlHandler, False)
|
608
|
-
servicemanager.Debugging(False)
|
609
|
-
g_debugService = None
|
610
|
-
|
611
|
-
|
612
|
-
def GetServiceClassString(cls, argv=None):
|
613
|
-
if argv is None:
|
614
|
-
argv = sys.argv
|
615
|
-
import pickle
|
616
|
-
|
617
|
-
modName = pickle.whichmodule(cls, cls.__name__)
|
618
|
-
if modName == "__main__":
|
619
|
-
try:
|
620
|
-
fname = win32api.GetFullPathName(argv[0])
|
621
|
-
path = os.path.split(fname)[0]
|
622
|
-
# Eaaaahhhh - sometimes this will be a short filename, which causes
|
623
|
-
# problems with 1.5.1 and the silly filename case rule.
|
624
|
-
filelist = win32api.FindFiles(fname)
|
625
|
-
# win32api.FindFiles will not detect files in a zip or exe. If list is empty,
|
626
|
-
# skip the test and hope the file really exists.
|
627
|
-
if len(filelist) != 0:
|
628
|
-
# Get the long name
|
629
|
-
fname = os.path.join(path, filelist[0][8])
|
630
|
-
except win32api.error:
|
631
|
-
raise error(
|
632
|
-
"Could not resolve the path name '%s' to a full path" % (argv[0])
|
633
|
-
)
|
634
|
-
modName = os.path.splitext(fname)[0]
|
635
|
-
return modName + "." + cls.__name__
|
636
|
-
|
637
|
-
|
638
|
-
def QueryServiceStatus(serviceName, machine=None):
|
639
|
-
hscm = win32service.OpenSCManager(machine, None, win32service.SC_MANAGER_CONNECT)
|
640
|
-
try:
|
641
|
-
hs = SmartOpenService(hscm, serviceName, win32service.SERVICE_QUERY_STATUS)
|
642
|
-
try:
|
643
|
-
status = win32service.QueryServiceStatus(hs)
|
644
|
-
finally:
|
645
|
-
win32service.CloseServiceHandle(hs)
|
646
|
-
finally:
|
647
|
-
win32service.CloseServiceHandle(hscm)
|
648
|
-
return status
|
649
|
-
|
650
|
-
|
651
|
-
def usage():
|
652
|
-
try:
|
653
|
-
fname = os.path.split(sys.argv[0])[1]
|
654
|
-
except:
|
655
|
-
fname = sys.argv[0]
|
656
|
-
print(
|
657
|
-
"Usage: '%s [options] install|update|remove|start [...]|stop|restart [...]|debug [...]'"
|
658
|
-
% fname
|
659
|
-
)
|
660
|
-
print("Options for 'install' and 'update' commands only:")
|
661
|
-
print(" --username domain\\username : The Username the service is to run under")
|
662
|
-
print(" --password password : The password for the username")
|
663
|
-
print(
|
664
|
-
" --startup [manual|auto|disabled|delayed] : How the service starts, default = manual"
|
665
|
-
)
|
666
|
-
print(" --interactive : Allow the service to interact with the desktop.")
|
667
|
-
print(
|
668
|
-
" --perfmonini file: .ini file to use for registering performance monitor data"
|
669
|
-
)
|
670
|
-
print(" --perfmondll file: .dll file to use when querying the service for")
|
671
|
-
print(" performance data, default = perfmondata.dll")
|
672
|
-
print("Options for 'start' and 'stop' commands only:")
|
673
|
-
print(" --wait seconds: Wait for the service to actually start or stop.")
|
674
|
-
print(" If you specify --wait with the 'stop' option, the service")
|
675
|
-
print(" and all dependent services will be stopped, each waiting")
|
676
|
-
print(" the specified period.")
|
677
|
-
sys.exit(1)
|
678
|
-
|
679
|
-
|
680
|
-
def HandleCommandLine(
|
681
|
-
cls,
|
682
|
-
serviceClassString=None,
|
683
|
-
argv=None,
|
684
|
-
customInstallOptions="",
|
685
|
-
customOptionHandler=None,
|
686
|
-
):
|
687
|
-
"""Utility function allowing services to process the command line.
|
688
|
-
|
689
|
-
Allows standard commands such as 'start', 'stop', 'debug', 'install' etc.
|
690
|
-
|
691
|
-
Install supports 'standard' command line options prefixed with '--', such as
|
692
|
-
--username, --password, etc. In addition,
|
693
|
-
the function allows custom command line options to be handled by the calling function.
|
694
|
-
"""
|
695
|
-
err = 0
|
696
|
-
|
697
|
-
if argv is None:
|
698
|
-
argv = sys.argv
|
699
|
-
|
700
|
-
if len(argv) <= 1:
|
701
|
-
usage()
|
702
|
-
|
703
|
-
serviceName = cls._svc_name_
|
704
|
-
serviceDisplayName = cls._svc_display_name_
|
705
|
-
if serviceClassString is None:
|
706
|
-
serviceClassString = GetServiceClassString(cls)
|
707
|
-
|
708
|
-
# Pull apart the command line
|
709
|
-
import getopt
|
710
|
-
|
711
|
-
try:
|
712
|
-
opts, args = getopt.getopt(
|
713
|
-
argv[1:],
|
714
|
-
customInstallOptions,
|
715
|
-
[
|
716
|
-
"password=",
|
717
|
-
"username=",
|
718
|
-
"startup=",
|
719
|
-
"perfmonini=",
|
720
|
-
"perfmondll=",
|
721
|
-
"interactive",
|
722
|
-
"wait=",
|
723
|
-
],
|
724
|
-
)
|
725
|
-
except getopt.error as details:
|
726
|
-
print(details)
|
727
|
-
usage()
|
728
|
-
userName = None
|
729
|
-
password = None
|
730
|
-
perfMonIni = perfMonDll = None
|
731
|
-
startup = None
|
732
|
-
delayedstart = None
|
733
|
-
interactive = None
|
734
|
-
waitSecs = 0
|
735
|
-
for opt, val in opts:
|
736
|
-
if opt == "--username":
|
737
|
-
userName = val
|
738
|
-
elif opt == "--password":
|
739
|
-
password = val
|
740
|
-
elif opt == "--perfmonini":
|
741
|
-
perfMonIni = val
|
742
|
-
elif opt == "--perfmondll":
|
743
|
-
perfMonDll = val
|
744
|
-
elif opt == "--interactive":
|
745
|
-
interactive = 1
|
746
|
-
elif opt == "--startup":
|
747
|
-
map = {
|
748
|
-
"manual": win32service.SERVICE_DEMAND_START,
|
749
|
-
"auto": win32service.SERVICE_AUTO_START,
|
750
|
-
"delayed": win32service.SERVICE_AUTO_START, ## ChangeServiceConfig2 called later
|
751
|
-
"disabled": win32service.SERVICE_DISABLED,
|
752
|
-
}
|
753
|
-
startup = map.get(val.lower())
|
754
|
-
if not startup:
|
755
|
-
print(f"{val!r} is not a valid startup option")
|
756
|
-
if val.lower() == "delayed":
|
757
|
-
delayedstart = True
|
758
|
-
elif val.lower() == "auto":
|
759
|
-
delayedstart = False
|
760
|
-
## else no change
|
761
|
-
elif opt == "--wait":
|
762
|
-
try:
|
763
|
-
waitSecs = int(val)
|
764
|
-
except ValueError:
|
765
|
-
print("--wait must specify an integer number of seconds.")
|
766
|
-
usage()
|
767
|
-
|
768
|
-
arg = args[0]
|
769
|
-
knownArg = 0
|
770
|
-
# First we process all arguments which pass additional args on
|
771
|
-
if arg == "start":
|
772
|
-
knownArg = 1
|
773
|
-
print("Starting service %s" % (serviceName))
|
774
|
-
try:
|
775
|
-
StartService(serviceName, args[1:])
|
776
|
-
if waitSecs:
|
777
|
-
WaitForServiceStatus(
|
778
|
-
serviceName, win32service.SERVICE_RUNNING, waitSecs
|
779
|
-
)
|
780
|
-
except win32service.error as exc:
|
781
|
-
print("Error starting service: %s" % exc.strerror)
|
782
|
-
err = exc.winerror
|
783
|
-
|
784
|
-
elif arg == "restart":
|
785
|
-
knownArg = 1
|
786
|
-
print("Restarting service %s" % (serviceName))
|
787
|
-
RestartService(serviceName, args[1:])
|
788
|
-
if waitSecs:
|
789
|
-
WaitForServiceStatus(serviceName, win32service.SERVICE_RUNNING, waitSecs)
|
790
|
-
|
791
|
-
elif arg == "debug":
|
792
|
-
knownArg = 1
|
793
|
-
if not hasattr(sys, "frozen"):
|
794
|
-
# non-frozen services use pythonservice.exe which handles a
|
795
|
-
# -debug option
|
796
|
-
svcArgs = " ".join(args[1:])
|
797
|
-
try:
|
798
|
-
exeName = LocateSpecificServiceExe(serviceName)
|
799
|
-
except win32api.error as exc:
|
800
|
-
if exc.winerror == winerror.ERROR_FILE_NOT_FOUND:
|
801
|
-
print("The service does not appear to be installed.")
|
802
|
-
print("Please install the service before debugging it.")
|
803
|
-
sys.exit(1)
|
804
|
-
raise
|
805
|
-
try:
|
806
|
-
os.system(f"{exeName} -debug {serviceName} {svcArgs}")
|
807
|
-
# ^C is used to kill the debug service. Sometimes Python also gets
|
808
|
-
# interrupted - ignore it...
|
809
|
-
except KeyboardInterrupt:
|
810
|
-
pass
|
811
|
-
else:
|
812
|
-
# py2exe services don't use pythonservice - so we simulate
|
813
|
-
# debugging here.
|
814
|
-
DebugService(cls, args)
|
815
|
-
|
816
|
-
if not knownArg and len(args) != 1:
|
817
|
-
usage() # the rest of the cmds don't take addn args
|
818
|
-
|
819
|
-
if arg == "install":
|
820
|
-
knownArg = 1
|
821
|
-
try:
|
822
|
-
serviceDeps = cls._svc_deps_
|
823
|
-
except AttributeError:
|
824
|
-
serviceDeps = None
|
825
|
-
try:
|
826
|
-
exeName = cls._exe_name_
|
827
|
-
except AttributeError:
|
828
|
-
exeName = None # Default to PythonService.exe
|
829
|
-
try:
|
830
|
-
exeArgs = cls._exe_args_
|
831
|
-
except AttributeError:
|
832
|
-
exeArgs = None
|
833
|
-
try:
|
834
|
-
description = cls._svc_description_
|
835
|
-
except AttributeError:
|
836
|
-
description = None
|
837
|
-
print(f"Installing service {serviceName}")
|
838
|
-
# Note that we install the service before calling the custom option
|
839
|
-
# handler, so if the custom handler fails, we have an installed service (from NT's POV)
|
840
|
-
# but is unlikely to work, as the Python code controlling it failed. Therefore
|
841
|
-
# we remove the service if the first bit works, but the second doesn't!
|
842
|
-
try:
|
843
|
-
InstallService(
|
844
|
-
serviceClassString,
|
845
|
-
serviceName,
|
846
|
-
serviceDisplayName,
|
847
|
-
serviceDeps=serviceDeps,
|
848
|
-
startType=startup,
|
849
|
-
bRunInteractive=interactive,
|
850
|
-
userName=userName,
|
851
|
-
password=password,
|
852
|
-
exeName=exeName,
|
853
|
-
perfMonIni=perfMonIni,
|
854
|
-
perfMonDll=perfMonDll,
|
855
|
-
exeArgs=exeArgs,
|
856
|
-
description=description,
|
857
|
-
delayedstart=delayedstart,
|
858
|
-
)
|
859
|
-
if customOptionHandler:
|
860
|
-
customOptionHandler(*(opts,))
|
861
|
-
print("Service installed")
|
862
|
-
except win32service.error as exc:
|
863
|
-
if exc.winerror == winerror.ERROR_SERVICE_EXISTS:
|
864
|
-
arg = "update" # Fall through to the "update" param!
|
865
|
-
else:
|
866
|
-
print(
|
867
|
-
"Error installing service: %s (%d)" % (exc.strerror, exc.winerror)
|
868
|
-
)
|
869
|
-
err = exc.winerror
|
870
|
-
except ValueError as msg: # Can be raised by custom option handler.
|
871
|
-
print("Error installing service: %s" % str(msg))
|
872
|
-
err = -1
|
873
|
-
# xxx - maybe I should remove after _any_ failed install - however,
|
874
|
-
# xxx - it may be useful to help debug to leave the service as it failed.
|
875
|
-
# xxx - We really _must_ remove as per the comments above...
|
876
|
-
# As we failed here, remove the service, so the next installation
|
877
|
-
# attempt works.
|
878
|
-
try:
|
879
|
-
RemoveService(serviceName)
|
880
|
-
except win32api.error:
|
881
|
-
print("Warning - could not remove the partially installed service.")
|
882
|
-
|
883
|
-
if arg == "update":
|
884
|
-
knownArg = 1
|
885
|
-
try:
|
886
|
-
serviceDeps = cls._svc_deps_
|
887
|
-
except AttributeError:
|
888
|
-
serviceDeps = None
|
889
|
-
try:
|
890
|
-
exeName = cls._exe_name_
|
891
|
-
except AttributeError:
|
892
|
-
exeName = None # Default to PythonService.exe
|
893
|
-
try:
|
894
|
-
exeArgs = cls._exe_args_
|
895
|
-
except AttributeError:
|
896
|
-
exeArgs = None
|
897
|
-
try:
|
898
|
-
description = cls._svc_description_
|
899
|
-
except AttributeError:
|
900
|
-
description = None
|
901
|
-
print("Changing service configuration")
|
902
|
-
try:
|
903
|
-
ChangeServiceConfig(
|
904
|
-
serviceClassString,
|
905
|
-
serviceName,
|
906
|
-
serviceDeps=serviceDeps,
|
907
|
-
startType=startup,
|
908
|
-
bRunInteractive=interactive,
|
909
|
-
userName=userName,
|
910
|
-
password=password,
|
911
|
-
exeName=exeName,
|
912
|
-
displayName=serviceDisplayName,
|
913
|
-
perfMonIni=perfMonIni,
|
914
|
-
perfMonDll=perfMonDll,
|
915
|
-
exeArgs=exeArgs,
|
916
|
-
description=description,
|
917
|
-
delayedstart=delayedstart,
|
918
|
-
)
|
919
|
-
if customOptionHandler:
|
920
|
-
customOptionHandler(*(opts,))
|
921
|
-
print("Service updated")
|
922
|
-
except win32service.error as exc:
|
923
|
-
print(
|
924
|
-
"Error changing service configuration: %s (%d)"
|
925
|
-
% (exc.strerror, exc.winerror)
|
926
|
-
)
|
927
|
-
err = exc.winerror
|
928
|
-
|
929
|
-
elif arg == "remove":
|
930
|
-
knownArg = 1
|
931
|
-
print("Removing service %s" % (serviceName))
|
932
|
-
try:
|
933
|
-
RemoveService(serviceName)
|
934
|
-
print("Service removed")
|
935
|
-
except win32service.error as exc:
|
936
|
-
print("Error removing service: %s (%d)" % (exc.strerror, exc.winerror))
|
937
|
-
err = exc.winerror
|
938
|
-
elif arg == "stop":
|
939
|
-
knownArg = 1
|
940
|
-
print("Stopping service %s" % (serviceName))
|
941
|
-
try:
|
942
|
-
if waitSecs:
|
943
|
-
StopServiceWithDeps(serviceName, waitSecs=waitSecs)
|
944
|
-
else:
|
945
|
-
StopService(serviceName)
|
946
|
-
except win32service.error as exc:
|
947
|
-
print("Error stopping service: %s (%d)" % (exc.strerror, exc.winerror))
|
948
|
-
err = exc.winerror
|
949
|
-
if not knownArg:
|
950
|
-
err = -1
|
951
|
-
print("Unknown command - '%s'" % arg)
|
952
|
-
usage()
|
953
|
-
return err
|
954
|
-
|
955
|
-
|
956
|
-
#
|
957
|
-
# Useful base class to build services from.
|
958
|
-
#
|
959
|
-
class ServiceFramework:
|
960
|
-
# Required Attributes:
|
961
|
-
# _svc_name_ = The service name
|
962
|
-
# _svc_display_name_ = The service display name
|
963
|
-
|
964
|
-
# Optional Attributes:
|
965
|
-
_svc_deps_ = None # sequence of service names on which this depends
|
966
|
-
_exe_name_ = None # Default to PythonService.exe
|
967
|
-
_exe_args_ = None # Default to no arguments
|
968
|
-
_svc_description_ = (
|
969
|
-
None # Only exists on Windows 2000 or later, ignored on windows NT
|
970
|
-
)
|
971
|
-
|
972
|
-
def __init__(self, args):
|
973
|
-
import servicemanager
|
974
|
-
|
975
|
-
self.ssh = servicemanager.RegisterServiceCtrlHandler(
|
976
|
-
args[0], self.ServiceCtrlHandlerEx, True
|
977
|
-
)
|
978
|
-
servicemanager.SetEventSourceName(self._svc_name_)
|
979
|
-
self.checkPoint = 0
|
980
|
-
|
981
|
-
def GetAcceptedControls(self):
|
982
|
-
# Setup the service controls we accept based on our attributes. Note
|
983
|
-
# that if you need to handle controls via SvcOther[Ex](), you must
|
984
|
-
# override this.
|
985
|
-
accepted = 0
|
986
|
-
if hasattr(self, "SvcStop"):
|
987
|
-
accepted |= win32service.SERVICE_ACCEPT_STOP
|
988
|
-
if hasattr(self, "SvcPause") and hasattr(self, "SvcContinue"):
|
989
|
-
accepted |= win32service.SERVICE_ACCEPT_PAUSE_CONTINUE
|
990
|
-
if hasattr(self, "SvcShutdown"):
|
991
|
-
accepted |= win32service.SERVICE_ACCEPT_SHUTDOWN
|
992
|
-
return accepted
|
993
|
-
|
994
|
-
def ReportServiceStatus(
|
995
|
-
self, serviceStatus, waitHint=5000, win32ExitCode=0, svcExitCode=0
|
996
|
-
):
|
997
|
-
if self.ssh is None: # Debugging!
|
998
|
-
return
|
999
|
-
if serviceStatus == win32service.SERVICE_START_PENDING:
|
1000
|
-
accepted = 0
|
1001
|
-
else:
|
1002
|
-
accepted = self.GetAcceptedControls()
|
1003
|
-
|
1004
|
-
if serviceStatus in [
|
1005
|
-
win32service.SERVICE_RUNNING,
|
1006
|
-
win32service.SERVICE_STOPPED,
|
1007
|
-
]:
|
1008
|
-
checkPoint = 0
|
1009
|
-
else:
|
1010
|
-
self.checkPoint += 1
|
1011
|
-
checkPoint = self.checkPoint
|
1012
|
-
|
1013
|
-
# Now report the status to the control manager
|
1014
|
-
status = (
|
1015
|
-
win32service.SERVICE_WIN32_OWN_PROCESS,
|
1016
|
-
serviceStatus,
|
1017
|
-
accepted, # dwControlsAccepted,
|
1018
|
-
win32ExitCode, # dwWin32ExitCode;
|
1019
|
-
svcExitCode, # dwServiceSpecificExitCode;
|
1020
|
-
checkPoint, # dwCheckPoint;
|
1021
|
-
waitHint,
|
1022
|
-
)
|
1023
|
-
win32service.SetServiceStatus(self.ssh, status)
|
1024
|
-
|
1025
|
-
def SvcInterrogate(self):
|
1026
|
-
# Assume we are running, and everyone is happy.
|
1027
|
-
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
|
1028
|
-
|
1029
|
-
def SvcOther(self, control):
|
1030
|
-
try:
|
1031
|
-
print("Unknown control status - %d" % control)
|
1032
|
-
except OSError:
|
1033
|
-
# services may not have a valid stdout!
|
1034
|
-
pass
|
1035
|
-
|
1036
|
-
def ServiceCtrlHandler(self, control):
|
1037
|
-
return self.ServiceCtrlHandlerEx(control, 0, None)
|
1038
|
-
|
1039
|
-
# The 'Ex' functions, which take additional params
|
1040
|
-
def SvcOtherEx(self, control, event_type, data):
|
1041
|
-
# The default here is to call self.SvcOther as that is the old behaviour.
|
1042
|
-
# If you want to take advantage of the extra data, override this method
|
1043
|
-
return self.SvcOther(control)
|
1044
|
-
|
1045
|
-
def ServiceCtrlHandlerEx(self, control, event_type, data):
|
1046
|
-
if control == win32service.SERVICE_CONTROL_STOP:
|
1047
|
-
return self.SvcStop()
|
1048
|
-
elif control == win32service.SERVICE_CONTROL_PAUSE:
|
1049
|
-
return self.SvcPause()
|
1050
|
-
elif control == win32service.SERVICE_CONTROL_CONTINUE:
|
1051
|
-
return self.SvcContinue()
|
1052
|
-
elif control == win32service.SERVICE_CONTROL_INTERROGATE:
|
1053
|
-
return self.SvcInterrogate()
|
1054
|
-
elif control == win32service.SERVICE_CONTROL_SHUTDOWN:
|
1055
|
-
return self.SvcShutdown()
|
1056
|
-
else:
|
1057
|
-
return self.SvcOtherEx(control, event_type, data)
|
1058
|
-
|
1059
|
-
def SvcRun(self):
|
1060
|
-
# This is the entry point the C framework calls when the Service is
|
1061
|
-
# started. Your Service class should implement SvcDoRun().
|
1062
|
-
# Or you can override this method for more control over the Service
|
1063
|
-
# statuses reported to the SCM.
|
1064
|
-
|
1065
|
-
# If this method raises an exception, the C framework will detect this
|
1066
|
-
# and report a SERVICE_STOPPED status with a non-zero error code.
|
1067
|
-
|
1068
|
-
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
|
1069
|
-
self.SvcDoRun()
|
1070
|
-
# Once SvcDoRun terminates, the service has stopped.
|
1071
|
-
# We tell the SCM the service is still stopping - the C framework
|
1072
|
-
# will automatically tell the SCM it has stopped when this returns.
|
1073
|
-
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
|