【问题标题】:Virtual environments and embedding Python虚拟环境和嵌入 Python
【发布时间】:2012-02-18 09:19:13
【问题描述】:

我非常喜欢 Python 的 virtualenv,它有助于维护单独的 Python 配置。我正在考虑将 Python 嵌入到 C++ 应用程序中,并且想知道嵌入式 Python 在虚拟环境中的表现如何。

我特别想知道是否可以根据一些用户定义的设置“选择”虚拟环境(例如,通过在配置文件中命名感兴趣的虚拟环境)。

【问题讨论】:

    标签: python embed virtualenv


    【解决方案1】:

    virtualenv 文档包含一个 Using virtualenv without bin/python 部分,该部分提示如何在解释器已经运行后配置虚拟环境。

    为避免硬编码 activate_this.py 脚本的路径,我使用以下 sn-p:

    def resolve_virtual_environment(override=None):
        """Fetch the virtual environment path in the
           process' environment or use an override."""
        path = os.getenv('VIRTUAL_ENV')
        if override:
            path = os.path.join(os.getcwd(), override)
        return path
    
    def activate_virtual_environment(environment_root):
        """Configures the virtual environment starting at ``environment_root``."""
        activate_script = os.path.join(
            environment_root, 'Scripts', 'activate_this.py')
        execfile(activate_script, {'__file__': activate_script})
    

    你可以像这样使用它:

    if __name__ == '__main__':
        # use first argument is provided.
        override = None
        if len(sys.argv) > 1:
            override = sys.argv[1]
        environment_root = resolve_virtual_environment(override)
    

    您可以从配置文件或其他东西中获取override 值,而不是从命令行参数中获取。

    请注意,您仍然只能使用单个虚拟环境预处理。

    注意:与使用捆绑在虚拟环境中的解释器相比,您可以访问为您启动的解释器安装的软件包。例如,当使用全局安装的 Python 时,您将可以访问全局安装的包。

    还要确保您使用的 Python 解释器的版本与您用于创建虚拟环境的任何版本相匹配,以确保标准库(复制到虚拟环境中)版本与 Python 解释器版本相匹配。

    【讨论】:

    • 谢谢。我只需要从 C++ 端执行此操作,并在 Boost::Python 中模仿您的解决方案。它就像一个魅力! :)
    【解决方案2】:

    是的,当然。这只是您将 PYTHONPATH 设置为(或您编译的内容)的位置的问题。

    请务必查看pythonqt(不要误认为是 PySide 或 PyQt .. 它是另一种方式,将 Python 构建到 Qt C++ 应用程序中。

    【讨论】:

    • 实际上,我一直在为my own Python/C++ wrapper 使用 C++ 编写一个 WSGI 桥。这都是为了教育目的 :-) 我已经大致了解了 WSGI 的东西,并慢慢将它与一些 FastCGI 和 SCGI 处理程序集成。
    • 使用virtualenv真的只是修改PYTHONPATH的“聪明”方式吗?
    • 在我看来很像。关于它如何做事,计算路径,“分区”本身和一些配置,有一堆装饰。我根本不想贬低 virtualenv,但是,它不像是 chrooted 环境。它只是用“家”在哪里的概念来设置事物,并与一组工具捆绑在一起,用于安装同样相信同样事情的新模块。
    • 我知道,至少在 Windows 上,它实际上在环境中存储了解释器的副本。在我看来,它比仅仅使用PYTHONPATH 更复杂一点。你能指点我任何相关的(官方)文件吗?
    • virtualenv 文档中查看"compare & contrast with alternatives"。看来workingenv 只是更改了PYTHONPATH 并最终遇到了一些问题。
    猜你喜欢
    • 2021-07-23
    • 2019-04-28
    • 2019-11-16
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2019-09-24
    相关资源
    最近更新 更多