Ich bin derzeit versucht, die folgendes zu tun:Verdoppelte Escape-Zeichen
cmd = r'sudo sed -irn "1!N; s/<ip>127.0.0.1<\/ip>(\n.*4000.*)/<ip>0.0.0.0<\/ip>\1/" /usr/something.conf'
subprocess.Popen(cmd)
jedoch Popen beschwert, dass \\ 1 eine ungültige Referenz. Auf sie in pdb Inspektion ich das sehen,
'sudo sed -irn "1!N; s/<ip>127.0.0.1<\\/ip>(\\n.*4000.*)/<ip>0.0.0.0<\\/ip>\\1/" /usr/something.conf'
Es scheint, als ob Python eine zusätzliche \
erweitert. Gibt es eine Möglichkeit, das zu verhindern, so dass ich den Befehl wie Popen ausführen kann?
Auch zur Vereinfachung habe ich es aus dem Beispiel herausgelassen, aber das wird tatsächlich in einem SSH-Aufruf verpackt, bevor es an Popen übergeben wird, also ja ... es muss mit Popen
und sed
getan werden.
Als Referenz hier ist die vollständige Kette von Schritten die Schnur durch ...
ausgeführt werden gehtdef _formatCmd(cmdString, host=None, user=None, keyfile=None):
cmd = []
if host:
cmd.append('ssh')
keyfile = keyfile or getKeyFile()
if keyfile:
cmd.append('-i')
cmd.append(keyfile)
cmd.append("%[email protected]%s" % (user, host))
cmd.append(cmdString)
else:
cmd += cmdString.split()
return cmd
def runCmd(host, user, cmd, timeout=None, cleanup=False):
try:
cmd = _formatCmd(cmd, host=host, user=user)
except:
pass
#create cmd and add it to list of running cmds
proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
runningCmds[proc.pid] = proc
t = threading.Timer(timeout, proc.kill)
t.start()
stdout, stderr = proc.communicate()
t.cancel()
del runningCmds[proc.pid]
return (proc.returncode, stdout, stderr)
cmd = r'sudo sed -irn "1!N; s/<ip>127.0.0.1<\/ip>(\n.*4000.*)/<ip>0.0.0.0<\/ip>\1/" /usr/something.conf'
runCmd('1.1.1.1', 'username', cmd)
Die genaue Fehlermeldung zurückgegeben wird:
sed: -e expression #1, char 59: invalid reference \\1 on `s' command's RHS
Beachten Sie, dass 'r '\ 1'' dasselbe ist wie' '\\ 1'' ohne das' r'. Es gibt zwei Möglichkeiten, dieselbe Zeichenfolge zu schreiben. Python fügt keine zusätzlichen Backslashes hinzu. Was Sie sehen, ist pdb druckt die Zeichenfolge im nicht-raw-Modus. –
Können Sie den vollständigen Code ohne Vereinfachung sowie die * genaue * Fehlermeldung, die Sie sehen, posten? Wenn Sie Probleme haben, sind alle Ebenen wichtig. –
Sie entkommen eine Zeichenfolge, die nicht aufgrund der Verwendung von roher Notation ('cmd = r'string'') – mhlester