Je commence juste par python donc je me bats avec un exemple assez simple. Fondamentalement, je veux passer le nom d'un exécutable plus son entrée via les arguments de la ligne de commande, par exemple:
python myprogram refprogram.exe refinput.txt
Cela signifie que lors de l'exécution de myprogram
, il exécute refprogram.exe
et lui passe comme argument refinput
. J'ai essayé de le faire de la manière suivante:
import sys, string, os
print sys.argv
res = os.system(sys.argv(1)) sys.argv(2)
print res
Le message d'erreur que je reçois est:
res = os.system(sys.argv(1)) sys.argv(2)
^
SyntaxError: invalid syntax
Quelqu'un a une idée de ce que je fais mal?
J'exécute Python 2.7
Cette ligne
res = os.system(sys.argv(1)) sys.argv(2)
Est faux de deux façons.
Tout d'abord, sys.argv est une liste, vous utilisez donc des crochets pour accéder à son contenu:
sys.argv[1]
sys.argv[2]
Deuxièmement, vous fermez vos parenthèses sur os.system
Trop tôt, et sys.argv(2)
est suspendu à la fin de celui-ci. Vous souhaitez déplacer la parenthèse fermante à la toute fin de la ligne, après tous les arguments.
Troisièmement, vous devez séparer les arguments par des virgules, un simple espace ne suffira pas.
Votre dernière ligne devrait ressembler à ceci:
res = os.system(sys.argv[1], sys.argv[2])
Une manière bien meilleure de le faire est d'utiliser la bibliothèque argparse . La bibliothèque enveloppe d'envoyé facilite également l'utilisation de sous-processus .
Un exemple simple:
import argparse
import envoy
def main(**kwargs):
for key, value in kwargs.iteritems():
print key, value
cmd = '{0} {1}'.format(kwargs['program'], ' '.join(kwargs['infiles']))
r = envoy.run(cmd)
print r.std_out
print r.std_err
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Get a program and run it with input', version='%(prog)s 1.0')
parser.add_argument('program', type=str, help='Program name')
parser.add_argument('infiles', nargs='+', type=str, help='Input text files')
parser.add_argument('--out', type=str, default='temp.txt', help='name of output file')
args = parser.parse_args()
main(**vars(args))
Cela lit les arguments, les analyse, puis les envoie à la méthode principale sous la forme d'un dictionnaire de mots-clés et de valeurs. Cela vous permet de tester votre méthode principale indépendamment de votre code d'argument, en passant dans un dictionnaire préconstruit.
La méthode principale imprime les mots-clés et les valeurs. Ensuite, il crée une chaîne de commande et la transmet à l'envoyé pour l'exécuter. Enfin, il imprime la sortie de la commande.
Si vous avez installé pip, l'envoyé peut être installé avec pip install envoy
. La façon la plus simple d'obtenir pip est d'utiliser pip-installer .
sys.argv
Est une liste et est indexé à l'aide de crochets, par exemple sys.argv[1]
. Vous pouvez également vérifier len(sys.argv)
avant de l'indexer également.
De plus, si vous vouliez passer des paramètres à os.system()
, vous voudrez peut-être quelque chose comme os.system(' '.join(sys.argv[1:]))
, mais cela ne fonctionnera pas pour les arguments avec des espaces. Il vaut mieux utiliser le module de sous-processus.
sys.argv est une liste
import sys, string, os
print sys.argv
res = os.system(sys.argv[1]) sys.argv[2]
print res
Si vous exécutez Python 2.7, il est recommandé d'utiliser le nouveau module subprocess
.
Dans ce cas, vous écririez
import sys, subprocess
result = subprocess.check_output(sys.argv[1], sys.argv[2])