1. ホーム
  2. python

[解決済み] ModuleNotFoundError: win32serviceutil' という名前のモジュールはありません。

2022-02-09 02:19:29

質問

Windowsサービスとしてインストールできるプロジェクトがあるのですが、それがうまくいきません。

Venvは、このプロジェクトのために pywin32 パッケージがインストールされています (バージョン 227)。しかし、私はコンソールから python ファイルを実行しようとしている間に。

import win32serviceutil

以下のようなエラーが発生します。

ModuleNotFoundError: win32'という名前のモジュールはありません。

試してみたこと

  • パッケージの再インストール、および python -m pip install pywin32
  • インポートファッションを変更することで

    from win32 import win32serviceutil from win32.lib import win32serviceutil import win32.lib.win32serviceutil as win32serviceutil

  • 回答元 このスレッド

win32 は PyCharm によってフォルダとして認識されます。

不思議なのは、以下のコマンドを実行すると、Windowsサービスがインストールされることです。

python MyPythonFile.py install

エラーは返ってきません。しかし、コマンドでサービスを開始しようとしています。

python MyPythonFile.py start

を返します。

エラー1053:サービスは、開始または制御要求に適時に応答しませんでした。

デバッグモードの場合 python MyPythonFile.py debug を返します。

ModuleNotFoundError: win32serviceutil'という名前のモジュールはありません。

解決方法は?

このスレッドにある解決策でうまくいきました。 PythonService.exe を使って、virtualenv を使用しながら Python サービスをホストする

解決するために使用したコード。

import os
import sys

service_directory = os.path.dirname(__file__)
source_directory = os.path.abspath(service_directory)
os.chdir(source_directory)
venv_base = os.path.abspath(os.path.join(source_directory, "..", "..", "venv"))
sys.path.append(".")
old_os_path = os.environ['PATH']
os.environ['PATH'] = os.path.join(venv_base, "Scripts")+ os.pathsep + old_os_path
site_packages = os.path.join(venv_base, "Lib", "site-packages")
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = venv_base
new_sys_path = list()
for item in list(sys.path):
    if item not in prev_sys_path:
        new_sys_path.append(item)
        sys.path.remove(item)
sys.path[:0] = new_sys_path

このコードは、faulting imports の前に実行されなければなりません。