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
    放入几个本地软件包文件夹中
  • 通过git Install安装它们。
  • 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?