7
votes

Comment formater une ligne de commande shell d'une liste d'arguments en python

J'ai une liste d'arguments, par exemple ["Bonjour", "Bobbity Bob", "Bye"] . Comment puis-je formater ceux-ci afin qu'ils soient passés de manière appropriée à une coquille?

mauvais : xxx

correct : xxx


2 commentaires

Avez-vous besoin de gérer les cas lorsque certains arguments peuvent contenir des citations " s ou backslashes? \ 's ?.


@TokenMacGuyy: Ouais .. Je veux fondamentalement exactement comment il serait passé par popen , mais comme ligne de commande


4 Réponses :


0
votes

Qu'est-ce qui ne va pas avec l'approche de la vieille école: xxx

Peu importe si les arguments à un mot sont également cités.


1 commentaires

Travaux pour ces arguments, mais peut causer des problèmes (y compris les problèmes de sécurité) si les arguments peuvent éventuellement contenir des guillemets simples.



1
votes

Le moyen plus facile de résoudre votre problème est d'ajouter \ "... \" chaque fois que votre texte a au moins deux mots.
Donc, pour le faire:

# Update the list
for str in args:
  if len(str.split(" ")) > 2:
    # Update the element within the list by
    # Adding at the beginning and at the end \"

    ...

# Print args
" ".join(args)


1 commentaires

Cases où cela ne fonctionne pas: list_to_cmdline (["Curl ',' site / page. html? x = 1 & y = 2 '] ) list_to_cmdline (["Citations",' "\ '']) list_to_cmdline ([" ECHO ', "STAR",' * '])



1
votes

Si vous envoyez des valeurs à un script shell, subprocess.popen gère ceci pour vous:

http://docs.python.org/library/ subprocess.html? Highlight = popen # subprocess.popen

Sinon, je crois que vous êtes en train de manipuler. shlex.split fait l'inverse de ce que vous voulez, mais il ne semble pas y avoir de marche arrière.


0 commentaires

15
votes

Vous pouvez utiliser le sans-papiers mais longue stable (au moins depuis oct. 2004 ) sous-processus.list2cmdline : xxx


1 commentaires

Ah parfait .. exactement ce que je voulais. Je me demande pourquoi ce n'est pas documenté