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.
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.
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'"
.
subprocess
subprocess.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).
'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'
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)