Ich war ein wenig süchtig nach dem Teilprozess, also machte ich mir eine Notiz.
Beim Erstellen eines Hilfsskripts für die Bereitstellung war eine Verarbeitung erforderlich, die cp -pr entspricht. Die in Python geschriebene (unvollständige) cp-Implementierung lautet wie folgt.
python_cp
def _copy(src, dst):
if os.path.isfile(src):
shutil.copy2(src, dst)
return
if os.path.isdir(src) and os.path.isdir(dst):
target = os.path.join(dst, os.path.basename(src))
# TODO Fix behavior like cp -pr (Wenn das Zielverzeichnis vorhanden ist, die Dateien darunter/Das Verzeichnis sollte beibehalten werden)
if os.path.exists(target):
shutil.rmtree(target)
shutil.copytree(src, target)
return
if os.path.isdir(src) and os.path.isfile(dst):
raise IOError(
"(Src:directory/Dest:file) This combination isn't allowed")
Obwohl es Einschränkungen gibt (siehe Kommentare), konnte dieser Fall in dieser Anwendung nicht auftreten, daher ist er in Ordnung.
Ich hörte jedoch die Illusion, dass "Wow, der Ingenieur (lacht), der es nicht tut, obwohl ich cp mit Subprocess verschieben kann ..." wie üblich von der Seite, also beschloss ich, eine Implementierung zu schreiben, die Subprozess verwendet. ..
subprocess_cp_error
def _copy(src, dst):
subprocess.Popen(['cp', '-pr', src, dst]).communicate()
Bei dieser Implementierung können in src jedoch keine Platzhalter verwendet werden. Um den Platzhalter zu interpretieren, müssen Sie shell = True an Popen übergeben und den Befehl über die Shell ausführen. http://docs.python.jp/2.7/library/subprocess.html#subprocess.Popen
subprocess_cp_error2
def _copy(src, dst):
subprocess.Popen(['cp', '-pr', src, dst], shell=True).communicate()
Also dachte ich: "Ist das fertig?", Aber das ist nicht der Fall. Mit der obigen Implementierung funktioniert der Befehl cp überhaupt nicht. Wenn shell = True ist, wird der Befehl wie oben beschrieben über die Shell ausgeführt, entspricht jedoch dem folgenden Befehl.
via_shell_error
/bin/sh -c 'cp' '-pr' (src) (dst)
Auf den ersten Blick sieht es gut aus, aber in diesem Fall wird -pr nicht als Option für cp betrachtet, und src und dst werden nicht als Argumente für cp betrachtet. Mit anderen Worten, cp wurde ohne Argumente ausgeführt, was zu einem Fehler führte. Um korrekt zu sein, müssen Sie es wie folgt mit einer Zeichenfolge angeben
via_shell
/bin/sh -c 'cp -pr (src) (dst)'
Um den entsprechenden Unterprozess auszuführen, geben Sie den Befehl an Popen als Zeichenfolge anstelle eines Arrays an.
subprocess_cp
def _copy(src, dst):
subprocess.Popen('cp -pr {0} {1}'.format(src, dst), shell=True).communicate()
Sollte nicht shell = True sein, wenn nicht benötigt w Tatsächlich verursacht es auch eine Shell-Injektion, daher heißt es in der Bibliotheksreferenz auch: "Wenn Sie externe Eingaben verwenden, setzen Sie diese niemals auf True!" ...
Recommended Posts