虚拟环境与嵌入式Python
我非常喜欢Python的virtualenv
,它可以帮助我们管理不同的Python环境。现在我在考虑把Python嵌入到一个C++应用程序中,想知道嵌入的Python在虚拟环境中的表现会是怎样的。
具体来说,我想知道是否可以根据用户自定义的设置来“选择”一个虚拟环境(比如在配置文件中指定想要使用的虚拟环境名称)。
2 个回答
2
没错,绝对可以。这主要是看你把PYTHONPATH设置在哪里(或者你编译的时候用的是什么)。
记得去看看 pythonqt(不要和PySide或PyQt搞混了……它的方向正好相反,是把Python嵌入到Qt的C++应用程序中)。
5
虚拟环境的文档里有一部分提到如何在解释器已经运行的情况下配置虚拟环境,你可以在这里找到相关信息:在没有bin/python
的情况下使用虚拟环境。
为了避免在代码里写死activate_this.py
脚本的路径,我用了一段代码:
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解释器版本一致。