我有一个可以作为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”的模块
答案 0 :(得分:0)
此线程的解决方案有效: Using PythonService.exe to host python service while using virtualenv
我用来解析它的代码:
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
此代码必须在导入错误之前运行
答案 1 :(得分:0)
干得好:)
要使其与我配合使用,我必须更改下面一行中反映的虚拟env文件夹的路径,以指向我的venv文件夹
从这里:
venv_base = os.path.abspath(os.path.join(source_directory, "..", "..", "venv"))
对此:
venv_base = os.path.abspath(os.path.join(source_directory, "..", "..", "venv"))