Obtenez des arguments de ligne de commande comme une chaîne de caractères
Je veux imprimer tous les arguments de ligne de commande comme une seule chaîne. Exemple de la façon dont je l'appelle mon script et que je m'attends à être imprimé:
./RunT.py mytst.tst -c qwerty.c
mytst.tst -c qwerty.c
Le code qui fait que:
args = str(sys.argv[1:])
args = args.replace("[","")
args = args.replace("]","")
args = args.replace(",","")
args = args.replace("'","")
print args
J'ai fait tous les remplace parce que sys.argv[1:] renvoie ceci:
['mytst.tst', '-c', 'qwerty.c']
Est-il un meilleur moyen d'obtenir le même résultat? Je n'aime pas ces multiples remplacer les appels
OriginalL'auteur KocT9H | 2016-06-06
Vous devez vous connecter pour publier un commentaire.
Une option:
La
join()
fonction des jointures de ses arguments, quelle que soit la chaîne de caractères que vous l'appelez. Donc' '.join(...)
rejoint les arguments les espaces (' '
) entre eux.cela ne fonctionne pas lorsque l'original arguments contenus des espaces et ont été enfermés à l'intérieur de guillemets doubles , découvrez ma réponse , il couvre aussi .
Je suis d'accord avec cette réponse, c'est antipattern parce qu'il n'échappe pas à des espaces à l'intérieur des arguments
OriginalL'auteur cxw
Les arguments de ligne de commande sont déjà traités par le shell avant qu'ils ne soient envoyés dans
sys.argv
. Par conséquent, shell citant et les espaces sont partis et ne peut pas être exactement reconstruit.En supposant que l'utilisateur double-guillemets chaînes de caractères avec des espaces, voici un programme en python pour reconstruire la chaîne de commande avec ces citations.
Par exemple, la ligne de commande
produira les mêmes arguments que sortie:
depuis l'utilisateur double-cité seuls arguments avec des chaînes.
'foo bar'
) ou double-cité chaînes de caractères sans espaces ("foo"
) en bash, et peut-être quelques autres coquilles. Ah bien! (Aussi, nous ne pouvons pas exactement reconstruire les espaces entre les arguments.)ya le but est de ne pas entraver l'action de la commande. Même si nous ne manquez pas les guillemets , il ne sera pas question presque toujours si elle ne contient pas d'espaces entre les deux . On ne peut donc pas s'attendre à une correspondance exacte, mais un travail , nous le pouvons .
Fonctionne très bien. Voici la même chose qu'une compréhension de liste: commandstring = ' '.join(['"{}"'.format(a) si ' dans un autre '{}'.format(a) pour un dans sys.argv])
Et que dire de s'échapper double/single cite lui-même?
OriginalL'auteur Natesh bhat
Vous obtenez une des objets de la liste avec tous vos arguments si vous utilisez la syntaxe
[1:]
qui va de la deuxième argument est la dernière. Vous pouvez exécuter pour chaque boucle à se joindre à eux dans une chaîne:Vous êtes très à droite, j'ai oublié la langue j'ai été à l'aide d'un secong 😛 merci!
Eh bien, vous avez oublié sur l'évasion des symboles. Aussi il n'est pas pythonic façon de concaténer les éléments d'une liste.
OriginalL'auteur Brice
Ou peut ne
format
, et de multiplier la chaîne à la longueur desys.argv
:Ou peut ne
%
:OriginalL'auteur U9-Forward