我有一个创建并激活虚拟环境的脚本
import os
import platform
import subprocess
import venv
# Determine the user's platform
current_platform = platform.system()
# Define the name of the virtual environment
venv_name = "my_venv"
# Create the virtual environment using EnvBuilder
builder = venv.EnvBuilder(system_site_packages=False, clear=True, symlinks=False, upgrade=False, with_pip=True)
builder.create(venv_name)
# Activate the virtual environment
if current_platform == "Windows":
activate_path = os.path.join(venv_name, "Scripts", "activate.ps1")
subprocess.call([f"powershell.exe", f"{activate_path}"])
else:
activate_path = os.path.join(venv_name, "bin", "activate")
subprocess.call([f"bash", f"source {activate_path}"])
它适用于 Windows,但是当脚本执行完成时,venv 不会保持活动状态。这意味着我无法在终端中访问 venv,这是可取的。如果我写“.\my_venv\Scripts\Activate.ps1”,那么我会看到它已被激活。有没有人有办法解决这个问题?
执行脚本,预计 venv 将在终端中保持活动状态,但事实并非如此。
你想要的在 *nix 系统上是不可能的。该进程可以影响其环境及其子进程环境。为了让 venv 在脚本“完成执行”时保持活动状态,您必须使用
os.exec*()
。
def main()->None:
"""
https://stackoverflow.com/questions/21641405/replace-a-running-python-script-with-os-execl
https://stackoverflow.com/questions/4025442/what-does-os-execl-do-exactly-why-am-i-getting-this-error
"""
my_venv: str = ensure_venv()
shell:str = os.getenv('SHELL', 'bash')
os.execvp(shell, ['-i',])