当前位置: 首页 > 面试题库 >

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

汪兴为
2023-03-14
问题内容

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

问题是当我尝试从源代码运行服务时(使用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并调用它。

运行service.py时如何获取PythonService.exe以使用virtualenv?


问题答案:

virtualenv在将虚拟环境添加到Python3.3之前,这似乎可以正常使用该模块。有轶事证据表明,Pythonsite.py曾经从可执行文件中向上查找,直到找到可以满足导入要求的目录为止。然后将其用于sys.prefix,这对于PythonService.exe来说足以找到它所在的virtualenv并使用它。

如果是这种情况,那么site.py在引入venv模块后似乎不再这样做。相反,它pyvenv.cfg仅在一种情况下向上一级查找文件并为虚拟环境进行配置。当然,这对于PythonService.exe无效,后者已被埋藏在site-
packages下的pywin32模块中。

要解决此问题,我改编了activate_this.py原始virtualenv模块随附的代码。它用于引导嵌入在可执行文件中的解释器(PythonService.exe就是这种情况)以使用virtualenv。不幸的是,venv不包括此。

这对我有用。请注意,这假定虚拟环境名为my-venv,并且位于源代码位置的上方一层。

import os
import sys

if sys.executable.endswith("PythonService.exe"):

    # Change current working directory from PythonService.exe location to something better.
    service_directory = os.path.dirname(__file__)
    source_directory = os.path.abspath(os.path.join(service_directory, ".."))
    os.chdir(source_directory)
    sys.path.append(".")

    # Adapted from virtualenv's activate_this.py
    # Manually activate a virtual environment inside an already initialized interpreter.
    old_os_path = os.environ['PATH']
    venv_base = os.path.abspath(os.path.join(source_directory, "..", "my-venv"))
    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 = []
    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

困扰我的另一个因素-Twisted伙计们提供了pywin32的新pypi轮,可以更轻松地安装pip。与使用easy_install将正式win32
exe软件包安装到虚拟env中时得到的软件包相比,该软件包中的PythonService.exe行为异常(调用时找不到pywin32 dll)。



 类似资料:
  • 现在我正在使用AAD应用程序使服务成为= AAD应用程序 流程如下所示: 服务A:从托管标识获取令牌 服务A:转到KeyVault,出示令牌并获取AAD应用程序的秘密 服务A:转到AAD,提供一个秘密并为特定资源请求一个令牌 服务A:拨打服务B 服务B:验证令牌和资源 我想知道是否可以向我的服务注册托管标识,因此如果提供托管标识令牌,则服务B可以信任服务A。类似于这样: 服务A:从托管身份获取令牌

  • 问题内容: 使用virtualenv,我使用默认版本的Python(2.7)运行项目。在一个项目中,我需要使用Python 3.4。 我曾经将其安装在Mac上。现在,如何创建使用新版本的virtualenv? 例如sudo virtualenv envPython3 如果我尝试: 我得到: 问题答案: 只需运行 OP编辑后更新: 有没有在OP的版本virtualenv中的一个bug,如所描述这里。

  • 我使用在我的Mac上安装它。现在,我如何创建一个使用新版本的virtualenv? 例如sudo virtualenv envPython3 如果我试着:

  • 问题内容: 我在查看Cristoph Gohlke的python软件包时 ,发现有一个适用于Python 3.3的Virtualenv软件包。 由于标准python库v3.3中有 venv 软件包,我想知道单独安装此软件包是否有优势。 编辑:从这两个软件包的文档中,virtualenv 1.8.2和 venv 我可以说 venv 标准库软件包缺少以下功能: 选项 在setuptools之间选择还是

  • 问题内容: 因此,我有一个使用angularJS和nodeJS的网络应用程序。我不想只使用本地主机来演示我的项目,因为当我键入“ node server.js”然后转到本地主机时,它看起来一点也不酷。 由于我打算将Firebase用于数据,因此我注意到Firebase提供了托管。我尝试了它,但它似乎仅托管index.html,而不通过/使用server.js。我已经为服务器使用/更新了自定义文件。

  • 首先我们需要在服务器上安装 docker,推荐使用官方源的最新版本: wget -qO- https://get.docker.com/ | sh sudo usermod -aG docker $(whoami) 然后我们需要将合适的 docker 镜像下载到本地: docker pull mdillon/postgis # 目前 star 数最多的 PostGIS 镜像,依赖于官方的