Ce face Familia os.exec*: execv(), execvp(), execl()...
Funcțiile exec încarcă alt program în procesul curent: Python dispare și locul lui îl ia programul nou, cu același PID. De obicei se folosesc după fork(), în copil.
Literele din nume spun cum se dau argumentele: l = ca argumente separate (execl(cale, "ls", "-l")), v = ca listă (execv(cale, ["ls", "-l"])); p = programul este căutat în PATH; e = ultimul argument este un dicționar cu variabilele de mediu. Rezultă execl, execle, execlp, execlpe, execv, execve, execvp, execvpe. Primul argument din listă este numele programului (argv[0]).
Parametri
| Parametru | Descriere |
|---|---|
cale / program |
Programul pornit. |
argumente |
Argumentele, inclusiv argv[0]. |
env |
Pentru variantele cu e: mediul noului program. |
Ce returnează
Nu returnează (doar la eroare aruncă OSError).
Exemple
Exemplul 1: fork + exec
import os, sys
sys.stdout.flush()
for functie, argumente in [
(os.execvp, ("echo", ["echo", "execvp:", "salut"])),
(os.execlp, ("echo", "echo", "execlp:", "salut")),
(os.execvpe, ("sh", ["sh", "-c", "echo execvpe: $ORAS"], {"ORAS": "Iași", "PATH": os.environ["PATH"]})),
(os.execlpe, ("sh", "sh", "-c", "echo execlpe: $ORAS", {"ORAS": "Cluj", "PATH": os.environ["PATH"]})),
(os.execv, ("/bin/echo", ["echo", "execv"])),
(os.execl, ("/bin/echo", "echo", "execl")),
(os.execve, ("/bin/sh", ["sh", "-c", "echo execve: $X"], {"X": "1"})),
(os.execle, ("/bin/sh", "sh", "-c", "echo execle: $X", {"X": "2"})),
]:
pid = os.fork()
if pid == 0:
functie(*argumente)
os.waitpid(pid, 0)
print("Python continuă în părinte")
Rezultat
execvp: salut
execlp: salut
execvpe: Iași
execlpe: Cluj
execv
execl
execve: 1
execle: 2
Python continuă în părinte
Greșeli frecvente
- Uiți că primul element al listei este
argv[0]:os.execvp("ls", ["-l"])ruleazălsfără argumente, cu numele „-l”. - Apelezi
execfărăforkși te miri că restul scriptului nu mai rulează.
Comenzi înrudite
os.fork() și os.register_at_fork(): Creează o copie a procesului curent; ambele continuă de la același rând.Familia os.spawn*: spawnv(), spawnlp()...: Pornește un program nou ca proces separat; variante vechi, înlocuite de subprocess.subprocess.run(): Pornește un program extern, așteaptă să se termine și îi returnează rezultatul.