Maison > développement back-end > Tutoriel Python > 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)

不言
Libérer: 2019-03-27 09:48:03
avant
3142 Les gens l'ont consulté

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)
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal