v0.0.1 first commit
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class VirtualEnvManager:
|
||||
def __init__(self, venv_dir: Path, entry_script: Path) -> None:
|
||||
self.venv_dir = venv_dir
|
||||
self.entry_script = entry_script
|
||||
|
||||
@staticmethod
|
||||
def in_virtualenv() -> bool:
|
||||
return (
|
||||
hasattr(sys, "real_prefix")
|
||||
or sys.prefix != getattr(sys, "base_prefix", sys.prefix)
|
||||
)
|
||||
|
||||
def _venv_python(self) -> Path:
|
||||
if os.name == "nt":
|
||||
return self.venv_dir / "Scripts" / "python.exe"
|
||||
return self.venv_dir / "bin" / "python"
|
||||
|
||||
def ensure_and_reexec_if_needed(self) -> None:
|
||||
if self.in_virtualenv():
|
||||
return
|
||||
|
||||
venv_python = self._venv_python()
|
||||
if not venv_python.exists():
|
||||
subprocess.check_call([sys.executable, "-m", "venv", str(self.venv_dir)])
|
||||
|
||||
os.execv(
|
||||
str(venv_python),
|
||||
[str(venv_python), str(self.entry_script.resolve()), *sys.argv[1:]],
|
||||
)
|
||||
Reference in New Issue
Block a user