Python 3.x 从Python3脚本中激活venv
我们希望为不同版本的软件提供一个可随时部署的Python 3.x 从Python3脚本中激活venv,python-3.x,command-line,python-venv,Python 3.x,Command Line,Python Venv,我们希望为不同版本的软件提供一个可随时部署的venv 因此,我想编写一个简单的Python脚本,它调用几个bash命令来安装我们需要的每个包 因此,这些步骤是: 创建一个名称后缀为版本号的venv 激活此venv 从PyPy安装软件包 cd放入几个本地软件包文件夹中 通过git Install安装它们。 cpvenv文件夹中的几个文件 我现在的问题是,我找不到从脚本中激活venv的方法。我已经读过Python 2中是如何实现的(使用exefile),以及Python 3中的exec(open(p
venv
因此,我想编写一个简单的Python脚本,它调用几个bash命令来安装我们需要的每个包
因此,这些步骤是:
venv
venv
PyPy安装软件包
cd
放入几个本地软件包文件夹中cp
venv文件夹中的几个文件venv
的方法。我已经读过Python 2中是如何实现的(使用exefile
),以及Python 3中的exec(open(path_to_env_activate).read())
但是,Python3的第二个版本给了我一个语法错误:
Traceback (most recent call last):
File "build.py", line 32, in <module>
exec(open(venv_activate).read())
File "<string>", line 1
@echo off
^
SyntaxError: invalid syntax
回溯(最近一次呼叫最后一次):
文件“build.py”,第32行,在
exec(打开(venv_激活).read())
文件“”,第1行
@回音
^
SyntaxError:无效语法
我在这里做错了什么?或者,是否有一种最佳实践,可以使用带有脚本的软件包安装
venv
?我发现解决此问题的方法是使用venv模块创建环境,并结合来自Virtualenv中activate_this.py模块的代码。模块的源代码:
这个解决方案对我很有效。我使用它生成环境并安装json模板文件中描述的包
这是我的venv_控制器:
import venv
import os
import sys
import site
from pathlib import Path
class VenvController:
def __init__(self):
self.venv_name = 'venv'
self.base = str(Path().absolute() / self.venv_name)
self.bin_dir = str(Path().absolute() / self.venv_name / 'bin')
def create(self, project_name):
# Create venv
venv.create(
self.base,
prompt=f'arkistak-{project_name}',
with_pip=True
)
def activate(self):
# Only activating if venv created
if not os.path.exists(self.base):
return False
# Activate new environment. refer to
# https://github.com/pypa/virtualenv/blob/main
# /src/virtualenv/activation/python/activate_this.py
os.environ['PATH'] = os.pathsep.join([self.bin_dir] +
os.environ.get("PATH", "").split(os.pathsep))
os.environ['VIRTUAL_ENV'] = self.base
prev_length = len(sys.path)
for lib in "__LIB_FOLDERS__".split(os.pathsep):
path = os.path.realpath(os.path.join(self.bin_dir, lib))
site.addsitedir(path)
sys.path[:] = sys.path[prev_length:] + sys.path[0:prev_length]
sys.real_prefix = sys.prefix
sys.prefix = self.base
return True
考虑使用直接创建和交互虚拟环境。至于从Python中激活一个venv,这没有任何意义,因为激活一个venv应该将当前shell放入一个虚拟沙盒中,而当您已经在使用一个非虚拟Python来执行它时,这根本没有意义。顺便说一句,您看到的错误是因为您试图使用Python执行批处理文件。好的,扩展EnvBuilder对我来说似乎很有用。但现在我需要一个快速而肮脏的解决方案,这似乎是最简单的方法。不管怎样,有没有一种方法可以从脚本中激活venv?