Quel est le revers de shlex?split?

Comment puis-je inverser les résultats d'un shlex.split<!--4? C'est, comment puis-je obtenir une chaîne de caractères entre guillemets qui serait "ressemble à celui D'un shell Unix" donné list des cordes je souhaite cité?

Update0

j'ai localisé un bug Python, et j'ai fait des requêtes de fonctionnalités correspondantes ici.

33
demandé sur Matt Joiner 2011-01-20 17:33:11

5 réponses

Nous avons maintenant (3.3) ont un shlex.citation fonction. C'est rien d'autre que pipes.quote déplacé et documenté (code utilisant pipes.quote fonctionnera toujours). Voir http://bugs.python.org/issue9723 pour toute la discussion.

subprocess.list2cmdline est une fonction privée qui ne doit pas être utilisé. Il pourrait toutefois être déplacé à shlex et rendu officiellement public. Voir aussi http://bugs.python.org/issue1724822.

22
répondu Éric Araujo 2016-03-02 18:18:57

Que Diriez-vous d'utiliser pipes.quote?

import pipes
strings = ["ls", "/etc/services", "file with spaces"]
" ".join(pipes.quote(s) for s in strings)
# "ls /etc/services 'file with spaces'"

.

19
répondu tokland 2014-03-14 18:19:19

subprocesssubprocess.list2cmdline(). Ce N'est pas une API publique officielle, mais c'est mentionné dans le subprocess documentation et je pense que c'est assez sûr à utiliser. Il est plus sophistiqué que pipes.open() (pour le meilleur ou pour le pire).

6
répondu Larry Hastings 2011-07-24 04:37:10

'foo' et "'foo'" sont transformés par shlex.split pour la même liste:

In [44]: shlex.split("'foo'")
Out[44]: ['foo']

In [45]: shlex.split("foo")
Out[45]: ['foo']

Donc je ne pense pas qu'il est possible d'inverser shlex.split dans tous les cas, mais pourrait vous conduire à proximité:

In [20]: import subprocess
In [21]: subprocess.list2cmdline(shlex.split('prog -s "foo bar"'))
Out[21]: 'prog -s "foo bar"'

In [22]: subprocess.list2cmdline(shlex.split('prog -s "foo bar" "baz"'))
Out[22]: 'prog -s "foo bar" baz'
2
répondu unutbu 2011-01-26 17:48:27

il y a une requête de fonctionnalité pour ajouter shlex.join(), qui ferait exactement ce que vous demandez. Pour l'instant, il ne semble pas y avoir de progrès, bien que, la plupart du temps, il se contenterait d'avancer vers shlex.quote(). Dans le rapport de bogue, une implémentation suggérée est mentionnée:

' '.join(shlex.quote(x) for x in split_command)

voir https://bugs.python.org/issue22454

1
répondu Matthijs Kooijman 2018-04-25 12:49:03