Source code for pymyinstall.win_installer.pywin32_helper
"""
@grief Functions to help using pywin32.
:githublink:`%|py|5`
"""
from __future__ import print_function
import sys
import os
import shutil
if sys.version_info[0] == 2:
FileNotFoundError = Exception
[docs]def import_pywin32():
"""
For the module ``pywin32``,
this function tries to add the path to the DLL to ``PATH``
before throwing the exception:
``DLL load failed: The specified module could not be found``.
It checks the instruction ``import win32com``.
:githublink:`%|py|24`
"""
try:
import win32com
except ImportError as e:
if "DLL load failed:" in str(e):
import os
import sys
import numpy
from distutils.sysconfig import get_python_lib
paths = set([os.path.join(
os.path.split(sys.executable)[0], "Lib", "site-packages", "pywin32_system32"),
os.path.join(get_python_lib(), "pywin32_system32"),
os.path.join(
os.path.dirname(numpy.__file__), "..", "pywin32_system32"),
])
epath = os.environ["PATH"]
for path in paths:
# exe = os.path.abspath(os.path.dirname(sys.executable))
os.environ["PATH"] = epath + ";" + path
try:
import win32com
return win32com
except ImportError:
# we try the next path
pass
try:
import win32com
return win32com
except ImportError:
# addition for WinPython
exe = os.path.abspath(os.path.dirname(sys.executable))
os.environ["PATH"] = os.environ["PATH"] + ";" + exe
try:
import win32com
return win32com
except ImportError:
dll = os.listdir(path)
dll = [os.path.join(path, _) for _ in dll if "dll" in _]
if len(dll) == 0:
raise ImportError("Did you install pywin32?") from e
else:
raise ImportError(
"Some DLL must be copied:\n" + "\n".join(dll)) from e
else:
raise e
[docs]def fix_pywin32_installation(python_path=None, fLOG=print):
"""
copy DLL at the right place
:param python_path: python path
:param fLOG: logging function
.. faqref::
:title: pywin32 does not work
To check module `pywin32 <https://pypi.python.org/pypi/pywin32>`_ is installed,
you must run::
import win32com
If it displays the message ``ImportError: DLL load failed``, it means
it was not able to find DLLs *pythoncom34.dll*, *pythoncom34.dll*.
Two solutions:
* Add the folder ``C:\\Python34_x64\\Lib\\site-packages\\pywin32_system32``
to environment variable ``PATH``. That's what function
:func:`import_pywin32 <pymyinstall.win_installer.pywin32_helper.import_pywin32>` is doing every time it is called.
* Copy the two DLLs to ``C:\\Windows\\System32``, that's what function
:func:`fix_pywin32_installation <pymyinstall.win_installer.pywin32_helper.fix_pywin32_installation>` does if it is run with admin rights.
.. versionadded:: 1.1
:githublink:`%|py|101`
"""
if python_path is None:
python_path = sys.executable.replace("w.exe", ".exe")
if os.path.isfile(python_path):
python_path = os.path.dirname(python_path)
fdll = os.path.join(python_path, "Lib",
"site-packages", "pywin32_system32")
dest_fold = [python_path, os.path.join(python_path, "DLLs"),
"C:\\Windows\\System32"]
for dll in os.listdir(fdll):
full = os.path.join(fdll, dll)
if os.path.isdir(full):
continue
for destf in dest_fold:
dest = os.path.join(destf, dll)
if not os.path.exists(dest):
shutil.copy(full, destf)
fLOG("[pymy] copy", full, "to", destf)
else:
fLOG("[pymy] already copied", dest)