web-dev-qa-db-fra.com

Meilleure façon de renvoyer une valeur d’un script python

J'ai écrit un script dans python) qui prend quelques fichiers, effectue quelques tests et compte le nombre de total_bugs lors de l'écriture de nouveaux fichiers avec des informations pour chacun (bugs + plus).

Pour prendre quelques fichiers du répertoire de travail actuel:

myscript.py -i nom_entrée1 nom_entrée2

Lorsque ce travail est terminé, j'aimerais que le script retourne "total_bugs", mais je ne suis pas sûr de la meilleure façon de l'implémenter.

Actuellement, le script imprime des choses comme:

[working directory]
[files being opened]
[completed work for file a + num_of_bugs_for_a]
[completed work for file b + num_of_bugs_for_b]
...
[work complete]

Un peu d'aide (notes/conseils/exemples de code) pourrait être utile ici.

Btw, cela doit fonctionner pour Windows et Unix.

42
ofer.sheffer

Si vous voulez que votre script retourne valeurs, faites juste return [1,2,3] à partir d’une fonction encapsulant votre code, mais vous devez ensuite importer votre script à partir d’un autre script pour pouvoir utiliser ces informations:

Renvoie les valeurs (d'une fonction wrapping)

(encore une fois, cela devrait être exécuté par un script séparé Python et être importé afin de faire le moindre bien)):

import ...
def main():
    # calculate stuff
    return [1,2,3]

Codes de sortie en tant qu'indicateurs

(Ceci est généralement juste pour quand vous voulez indiquer à un gouverneur ce qui ne va pas ou simplement le nombre de bogues/lignes comptés ou w/e. Normalement, 0 est une bonne sortie et> = 1 est une mauvaise sortie mais vous pouvez inter - les valider comme vous voulez en extraire des données)

import sys
# calculate and stuff
sys.exit(100)

Et quittez avec un code de sortie spécifique en fonction de ce que vous voulez que votre gouverneur dise. J'ai utilisé des codes de sortie lors de l'exécution d'un script dans un environnement de planification et de surveillance pour indiquer ce qui s'est passé.

Stdout comme relais

Sinon, vous devrez utiliser stdout pour communiquer avec le monde extérieur (comme vous l'avez décrit). Mais c'est généralement une mauvaise idée, sauf si un analyseur syntaxique exécute votre script et peut capturer tout ce que vous signalez.

import sys
# calculate stuff
sys.stdout.write('Bugs: 5|Other: 10\n')
sys.stdout.flush()
sys.exit(0)

Exécutez-vous votre script dans un environnement de planification contrôlé, alors les codes de sortie sont la meilleure solution.

Fichiers comme convoyeurs

Il existe également la possibilité d'écrire simplement des informations dans un fichier et d'y stocker le résultat.

# calculate
with open('finish.txt', 'wb') as fh:
    fh.write(str(5)+'\n')

Et ramasser la valeur/résultat à partir de là. Vous pouvez même le faire dans un format CSV pour que les autres lisent de manière simpliste.

87
Torxed