環境

  • Windows 10
  • Python 3.7
  • pypiwin32 バージョン223

エラー状況

PythonからExcelのマクロを実行(COM実行)したくて「pypiwin32」をpipでインストールした。

「pip install pypiwin32」で直接システム上にインストールした場合は問題なく使用できたが、配布パッケージとしてまとめたかったので「pip install pypiwin32 -t ./Lib/site-packages」としてプロジェクトフォルダ内に直接インストールし、Pythonスクリプト内で

import os
import sys

script_path = os.path.dirname(__file__)
sys.path.append(os.path.join(script_path, "Lib/site-packages"))

import win32com.client

としてプロジェクトフォルダ内のpypiwin32を使用したところインポートエラーとなった。エラーメッセージは次の通り。

File "Lib/site-packages\win32com\__init__.py", line 5, in 
    import win32api, sys, os
ModuleNotFoundError: No module named 'win32api'

また修正対応中に以下の様なエラーメッセージも見られた。

File "Lib/site-packages\win32com\__init__.py", line 5, in 
    import win32api, sys, os
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
File "Lib/site-packages\win32com\__init__.py", line 6, in 
    import pythoncom
  File "Lib/site-packages\pythoncom.py", line 2, in 
    import pywintypes
ModuleNotFoundError: No module named 'pywintypes'

対応方法

Pythonスクリプトを以下のように変更するとインポートエラーを解消できた。

import os
import sys

script_path = os.path.dirname(__file__)
sys.path.append(os.path.join(script_path, "Lib/site-packages"))
sys.path.append(os.path.join(script_path, "Lib/site-packages/win32"))
sys.path.append(os.path.join(script_path, "Lib/site-packages/win32/lib"))
os.environ["PATH"] = os.environ["PATH"] + ";" + os.path.join(script_path , "Lib/site-packages/pywin32_system32")

import win32com.client

win32, win32/libフォルダをPythonのモジュール参照位置に追加し、さらに環境変数PATHにpywin32_system32フォルダを追加することでwin32apiをインポートできるようになった。

参照

Pywin32 does not find its DLL - XD blog