Familia os.exec*: execv(), execvp(), execl()… în Python

Procese (os) Python 3.0+

Înlocuiește programul curent cu alt program; codul de după apel nu mai rulează.

Sintaxă
os.execv(cale, argumente)
os.execvp(program, argumente)
os.execl(cale, arg0, arg1, ...)
...

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ă ls fără argumente, cu numele „-l”.
  • Apelezi exec fără fork și te miri că restul scriptului nu mai rulează.

Comenzi înrudite