web-dev-qa-db-fra.com

Python paramètres de ligne de commande

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

25
Patrick

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])
61
Ian Clelland

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 .

29
Spencer Rathbun

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.

8
FatalError

sys.argv est une liste

import sys, string, os
print sys.argv

res = os.system(sys.argv[1]) sys.argv[2]
print res
3
JohnMetta

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])
1
BergmannF