1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#-----------------------------------------------------------------------------
# Copyright (c) 2013-2023, PyInstaller Development Team.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
#
# The full license is in the file COPYING.txt, distributed with this software.
#
# SPDX-License-Identifier: Apache-2.0
#-----------------------------------------------------------------------------
 
# The win32.client.gencache code must be allowed to create the cache in %temp% (user's temp). It is necessary to get the
# gencache code to use a suitable directory other than the default in lib\site-packages\win32com\client\gen_py.
# PyInstaller does not provide this directory structure and the frozen executable could be placed in a non-writable
# directory like 'C:\Program Files. That's the reason for %temp% directory.
#
# http://www.py2exe.org/index.cgi/UsingEnsureDispatch
 
import atexit
import os
import shutil
import tempfile
 
# Put gen_py cache in temp directory.
supportdir = tempfile.mkdtemp()
# gen_py has to be put into directory 'gen_py'.
genpydir = os.path.join(supportdir, 'gen_py')
 
# Create 'gen_py' directory. This directory does not need to contain '__init__.py' file.
try:
    # win32com gencache cannot be put directly to 'supportdir' with any random name. It has to be put in a directory
    # called 'gen_py'. This is the reason why to create this directory in supportdir'.
    os.makedirs(genpydir)
    # Remove temp directory at application exit and ignore any errors.
    atexit.register(shutil.rmtree, supportdir, ignore_errors=True)
except OSError:
    pass
 
# Override the default path to gen_py cache.
import win32com  # noqa: E402
 
win32com.__gen_path__ = genpydir
 
# The attribute __loader__ makes module 'pkg_resources' working but On Windows it breaks pywin32 (win32com) and test
# 'basic/test_pyttsx' will fail. Just removing that attribute for win32com fixes that and gencache is created properly.
if hasattr(win32com, '__loader__'):
    del win32com.__loader__
 
# Ensure genpydir is in 'gen_py' module paths.
import win32com.gen_py  # noqa: E402
 
win32com.gen_py.__path__.insert(0, genpydir)