Quelle est la différence entre os.system et subprocess.call en Python?


Réponse 1:

La méthode os.system (command) exécute la commande en sous-shell.

La méthode subprocess.Popen (command_args,… ..) exécute la commande args en tant que nouveau processus (processus enfant). Vous pouvez envoyer / recevoir des données vers stdout / stdin en utilisant communic () de l'objet Popen.

La principale différence entre ces deux méthodes est que os.system renvoie le code d'état et subprocess.Popen renvoie l'objet Popen.

Créons un exemple de fichier child_process.py

importer os
imprimer "A l'intérieur du processus / fichier enfant"
affiche "id de processus enfant% s"% os.getpid ()
Exécutez ce fichier en utilisant os.system et subprocess.Popen

Exécutez ce script en utilisant os.system

prasad @ prasad-Vostro-3446: ~
$ python [3:52:58]
Python 2.7.6 (par défaut, 26 octobre 2016, 20:30:19)
[GCC 4.8.4] sur linux2
Tapez "aide", "copyright", "crédits" ou "licence" pour plus d'informations.
>>> import os
>>> sys_output = os.system ("python child_process.py")
Processus enfant interne
ID de processus enfant: 9082
>>> sys_output
>>> 0

Ainsi, os.system renvoie un code d'état 0 (zéro) lors de l'exécution réussie du script

Exécutez ce script à l'aide de sous-processus.

prasad @ prasad-Vostro-3446: ~
$ python [3:59:14]
Python 2.7.6 (par défaut, 26 octobre 2016, 20:30:19)
[GCC 4.8.4] sur linux2
Tapez "aide", "copyright", "crédits" ou "licence" pour plus d'informations.
>>> importer un sous-processus
>>> sub_output = subprocess.Popen (['python', 'abc.py'])
>>> À l'intérieur du processus enfant
Identifiant du processus enfant: 9165

>>> sub_output

>>> sub_output.pid
9165
>>> dir (sub_output)
['__class__', '__del__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', ' __reduce_ex__ ',' __repr__ ',' __setattr__ ',' __sizeof__ ',' __str__ ',' __subclasshook__ ',' __weakref__ ',' _child_created ',' _close_fds ',' _communicate ',' _communicate_with_poll ',' _commun_ , '_get_handles', '_handle_exitstatus', '_internal_poll', '_set_cloexec_flag', '_translate_newlines', 'communic', 'kill', 'pid', 'pipe_cloexec', 'poll', 'returncode', 'send_signal', ' stderr ',' stdin ',' stdout ',' terminate ',' universal_newlines ',' wait ']
>>>

Ici,

subprocess.Popen renvoie l'objet Popen.

Le Popen.pid nous donne le même identifiant de processus.

Vous pouvez contrôler le processus enfant car il a différentes méthodes comme tuer, terminer, attendre, communiquer, etc.


Réponse 2:

sous-processus

appel()

subprocess.Popen

subprocess.Popen (args, bufsize = 0, executable = None, stdin = None, stdout = None, stderr = None, preexec_fn = None, close_fds = False, shell = False, cwd = None, env = None, universal_newlines = False, startupinfo = Aucun, creationflags = 0)

os.system (commande)

os.system ()

subprocess.call

sous-processus

retval = os.system ('ls -l')
retval = subprocess.call ('ls -l', shell = True)

15.1. os - Interfaces diverses du système d'exploitation - Documentation Python v2.7.3

17.1. subprocess - Gestion des sous-processus - Documentation Python v2.7.3