Maison  >  Article  >  développement back-end  >  Introduction aux méthodes de niveau module de sous-traitement en Python (avec code)

Introduction aux méthodes de niveau module de sous-traitement en Python (avec code)

不言
不言avant
2019-03-27 09:48:033113parcourir

Le contenu de cet article est une introduction à la méthode au niveau du module de sous-processus en Python (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

subprocess.run()

Exécutez et attendez que l'instruction spécifiée par le paramètre args se termine, et renvoyez l'instance CompletedProcess.

Paramètres : (*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs). À l'exception de input, capture_output, timeout et check, les autres paramètres sont cohérents avec les paramètres du constructeur Popen.

capture_output : s'il est défini sur True, cela signifie rediriger stdout et stderr vers le tube, et plus aucun paramètre stderr ou stdout ne peut être transmis, sinon une exception sera levée.

Entrée : le paramètre d'entrée sera transmis à la méthode Popen.communicate() comme entrée standard du sous-processus et doit être une chaîne (les paramètres d'encodage ou d'erreur doivent être spécifiés, ou le texte est défini sur True) ou type d'octet. Les paramètres d'entrée Non-None ne peuvent pas être utilisés avec les paramètres stdin, sinon une exception sera levée et le paramètre stdin utilisé pour construire l'instance Popen sera spécifié comme subprocess.PIPE.

timeout : passé à la méthode Popen.communicate().

check : si défini sur True, une exception CalledProcessError sera levée si l'exécution du processus renvoie un code d'état non-0.

# 源码

def run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs):
    if input is not None:
        if 'stdin' in kwargs:
            raise ValueError('stdin and input arguments may not both be used.')
        kwargs['stdin'] = PIPE
    
    if capture_output:
        if ('stdout' in kwargs) or ('stderr' in kwargs):
            raise ValueError('stdout and stderr arguments may not be used '
                             'with capture_output.')
        kwargs['stdout'] = PIPE
        kwargs['stderr'] = PIPE
    
    with Popen(*popenargs, **kwargs) as process:
        try:
            stdout, stderr = process.communicate(input, timeout=timeout)
        except TimeoutExpired:
            process.kill()
            stdout, stderr = process.communicate()
            raise TimeoutExpired(process.args, timeout, output=stdout,
                                 stderr=stderr)
        except:  # Including KeyboardInterrupt, communicate handled that.
            process.kill()
            # We don't call process.wait() as .__exit__ does that for us.
            raise
        retcode = process.poll()
        if check and retcode:
            raise CalledProcessError(retcode, process.args,
                                     output=stdout, stderr=stderr)
    return CompletedProcess(process.args, retcode, stdout, stderr)

Avant python3.5, les trois méthodes call(), check_all() et checkoutput() constituaient l'API de haut niveau du module de sous-processus.

subprocess.call()

Exécutez et attendez que l'instruction spécifiée par le paramètre args se termine, et renvoyez le code d'état d'exécution (attribut returncode de l'instance Popen).

Paramètres : (*popenargs, timeout=Aucun, **kwargs). Fondamentalement identique aux paramètres du constructeur Popen, tous les paramètres, à l'exception du délai d'attente, seront transmis à l'interface Popen.

N'utilisez pas stdout=PIPE ou stderr=PIPE lors de l'appel de la fonction call(), car si le processus enfant génère suffisamment de sortie vers le canal pour remplir le tampon du canal du système d'exploitation, le processus enfant ne pourra pas lire données du tuyau.

# 源码

def call(*popenargs, timeout=None, **kwargs):
    with Popen(*popenargs, **kwargs) as p:
        try:
            return p.wait(timeout=timeout)
        except:
            p.kill()
            p.wait()
            raise

subprocess.check_call()

Exécutez et attendez que l'instruction spécifiée par le paramètre args se termine, renvoie un code d'état 0 ou lève une exception CalledProcessError, les attributs cmd et returncode de l'exception peut être visualisée et exécutée. Instructions exceptionnelles et codes d'état.

Paramètres : (*popenargs, **kwargs). Tous les paramètres sont passés à la fonction call().

Les notes sont les mêmes que call()

# 源码

def check_call(*popenargs, **kwargs):
    retcode = call(*popenargs, **kwargs)
    if retcode:
        cmd = kwargs.get("args")
        if cmd is None:
            cmd = popenargs[0]
        raise CalledProcessError(retcode, cmd)
    return 0

subprocess.check_output()

Exécutez et attendez que l'instruction spécifiée par le paramètre args se termine, et revenez sur la sortie standard (stdout de l'attribut d'instance CompletedProcess), le type par défaut est octet. Le codage d'octets peut dépendre de l'instruction exécutée. Le paramètre universal_newlines=True peut renvoyer une valeur de type chaîne.
Si le code d'état d'exécution est différent de 0, une exception CalledProcessError sera levée.

Paramètres : (*popenargs, timeout=Aucun, **kwargs). Tous les arguments sont transmis à la fonction run(), mais le passage explicite de input=None pour hériter du descripteur de fichier d'entrée standard du processus parent n'est pas pris en charge.

Pour capturer l'erreur standard dans la valeur de retour, définissez stderr=subprocess.STDOUT ; vous pouvez également rediriger l'erreur standard vers le canal stderr=subprocess.PIPE, accessible via l'attribut stderr de l'exception CalledProcessError.

# 源码

def check_output(*popenargs, timeout=None, **kwargs):
    if 'stdout' in kwargs:
        raise ValueError('stdout argument not allowed, it will be overridden.')

    if 'input' in kwargs and kwargs['input'] is None:
        # Explicitly passing input=None was previously equivalent to passing an
        # empty string. That is maintained here for backwards compatibility.
        kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b''

    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
               **kwargs).stdout

Le module de sous-processus fournit également les fonctions associées du module de commandes dans la version python2.x.

subprocess.getstatusoutput(cmd)

appelle en fait la fonction check_output(), exécute l'instruction cmd de type chaîne dans le shell et renvoie un tuple sous la forme de (code de sortie, sortie), Output (Contient stderr et stdout) est une chaîne décodée à l'aide du codage local avec la nouvelle ligne de fin supprimée.

# 源码

try:
    data = check_output(cmd, shell=True, universal_newlines=True, stderr=STDOUT)
    exitcode = 0
except CalledProcessError as ex:
    data = ex.output
    exitcode = ex.returncode
if data[-1:] == '\n':
    data = data[:-1]
return exitcode, data

subprocess.getoutput(cmd)

Similaire à getstatusoutput(), mais le résultat ne renvoie que la sortie.

Cet article est terminé ici. Pour un contenu plus passionnant, vous pouvez faire attention à la colonne Tutoriel vidéo Python sur le site Web PHP chinois !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer