2016-08-19 5 views
1

Ich habe eine Python 3-Anwendung, die irgendwann eine Zeichenfolge in die Zwischenablage setzen sollte. Ich verwende Systembefehle echo und pbcopy und es funktioniert ordnungsgemäß. Wenn die Zeichenfolge jedoch einen Apostroph enthält (und wer weiß, vielleicht andere Sonderzeichen), wird sie mit einem Fehler beendet. Hier ist ein Codebeispiel:Wie übergibt man in Python3/OS X einen String mit Apostroph an einen Terminalbefehl?

import os 

my_text = "Peoples Land" 
os.system("echo '%s' | pbcopy" % my_text) 

Es funktioniert in Ordnung. Aber wenn Sie die Zeichenfolge korrigieren „Volks Land“, gibt er diesen Fehler:

sh: -c: line 0: unexpected EOF while looking for matching `'' 
sh: -c: line 1: syntax error: unexpected end of file 

Ich denke, ich muss irgendwie die Zeichenfolge codieren, bevor es an die Shell-Befehle vorbei, aber ich weiß noch nicht, wie. Was ist der beste Weg, dies zu erreichen?

Antwort

1

Für Apostroph in einer Zeichenkette:

  • können Sie '%r' anstelle von '%s'
  • my_text = "People's Land" 
    os.system("echo '%r' | pbcopy" % my_text) 
    

Um eine Shell-escaped Version des Strings zu erhalten:

  • können Sie shlex.quote() verwenden

    import os, shlex 
    my_text = "People's Land, \"xyz\", hello" 
    os.system("echo %s | pbcopy" % shlex.quote(my_text)) 
    
+0

Ich habe versucht, diesen Vorschlag in meinem Code zu implementieren, aber ich hatte eine harte Zeit herauszufinden, warum es fehlgeschlagen ist. Ich fand heraus, dass ich die einfachen Anführungszeichen immer noch entfernen musste, genau wie du es getan hast, wenn du 'shlex.quote()' benutzt hast. Jetzt klappt es ok;) –

1

Dies hat mehr mit Shell tatsächlich entkommen zu tun.

Versuchen Sie dies in Kommandozeile:

echo 'People's Land' 

und dieses

echo 'People'\''s Land'

In Python so etwas wie dies funktionieren sollte:

>>> import os 
>>> my_text = "People'\\''s Land" 
>>> os.system("echo '%s' > lol" % my_text) 
+0

Gibt es eine Python-Funktion, die diese Art von Escaping durchführt? Ich habe es mit Werten zu tun, die in eine Datenbank eingegeben werden, daher wäre es besser, wenn der Code diese Konvertierung durchführt. –

+0

https://docs.python.org/3.5/library/shlex.html – Vatsal

Verwandte Themen