gpt4 book ai didi

python - 使用 PythonService.exe 在使用 virtualenv 时托管 python 服务

转载 作者:太空狗 更新时间:2023-10-29 20:12:15 25 4
gpt4 key购买 nike

我有一个 Windows 7 环境,我需要在其中使用 Python 3.4 开发 Python Windows 服务。我正在使用 pywin32 的 win32service 模块来设置服务,大多数 Hook 似乎工作正常。

问题是当我尝试从源代码运行服务时(使用 python service.py install 后跟 python service.py start)。这使用 PythonService.exe 来托管 service.py - 但我使用的是 venv 虚拟环境,脚本找不到它的模块(使用 python service.py debug 发现的错误消息)。

Pywin32安装在virtualenv中,查看PythonService.exe源码,动态链接Python34.dll,导入我的service.py并调用。

如何让 PythonService.exe 在运行我的 service.py 时使用我的 virtualenv?

最佳答案

非常感谢您发布这个问题和解决方案。我采取了一种略有不同的方法,这可能也很有用。很难找到 Python 服务的工作技巧,更不用说使用 virtualenv 了。无论如何...

步骤

这是使用 Windows 7 x64、Python 3.5.1 x64、pywin32-220(或 pypiwin32-219)。

  • 打开管理员命令提示符。
  • 创建一个虚拟环境。 C:\Python35\python -m venv myvenv
  • 激活虚拟环境。 调用 myvenv\scripts\activate.bat
  • 安装 pywin32,或者:
  • 运行安装后脚本 python myvenv\Scripts\pywin32_postinstall.py -install
    • 此脚本在系统中注册 DLL,并将它们复制到 C:\Windows\System32。 DLL 的名称为 pythoncom35.dllpywintypes35.dll。因此,同一台机器上同一主要 Python 点版本上的虚拟环境将共享这些……这是一个小的权衡:)
  • 复制 myvenv\Lib\site-packages\win32\pythonservice.exemyvenv\Scripts\pythonservice.exe
    • 在服务类(任何子类 win32serviceutil.ServiceFramework)上,设置类属性 _exe_path_ 以指向这个重定位的 exe。这将成为服务 binPath。例如:_exe_path_ = os.path.join(*[os.environ['VIRTUAL_ENV'], 'Scripts', 'pythonservice.exe'])

讨论

我认为这之所以有效,是因为 Python 会向上查找 Libs 文件夹的位置,并基于此设置包导入路径,类似于已接受的答案。当 pythonservice.exe 位于原始位置时,它似乎无法正常工作。

它还解决了 DLL 链接问题(可通过来自 http://www.dependencywalker.com/ 的 depends.exe 发现)。如果不解决 DLL 业务,就不可能从 venv\Lib\site-packages\win32 的 *.pyd 文件作为脚本中的模块导入。例如需要允许 import servicemanager;因为 servicemanager.pyd 不在包中作为 .py 文件,并且具有一些很酷的 Windows 事件日志功能。

我在接受答案时遇到的一个问题是我无法弄清楚如何让它准确地获取使用 setup.py develop 。当包不在 myvenv\Lib\site-packages 下的 virtualenv 中时,这些 .egg-link 文件包含包的路径。

如果一切顺利,应该可以安装、启动和测试示例 win32 服务(从激活的 virtualenv 中的管理员提示符):

python venv\Lib\site-packages\win32\Demos\service\pipeTestService.py install
python venv\Lib\site-packages\win32\Demos\service\pipeTestService.py start
python venv\Lib\site-packages\win32\Demos\service\pipeTestServiceClient.py

服务环境

所有这一切中的另一个重要注意事项是,该服务将在与您可能运行 python myservice.py debug 的环境完全不同的环境中执行 python 代码。因此,例如 os.environ['VIRTUAL_ENV'] 在运行服务时将为空。这可以通过以下任一方式处理:

关于python - 使用 PythonService.exe 在使用 virtualenv 时托管 python 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34696815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com