In Python, wie schreibt man einen string in eine Datei auf einer remote-Maschine?
Auf Computer1, ich habe ein Python2.7 Skript berechnet, dass eine große (bis zu 10MB) Binär-string im RAM, die würde ich gerne schreiben, um eine Datei auf Computer2 im Dialogfeld Lizenzaktivierung, die eine remote-Maschine. Was ist der beste Weg, dies zu tun?
Einschränkungen:
-
Beide Maschinen sind Ubuntu 13.04. Die Verbindung zwischen Ihnen ist schnell-Sie sind auf dem gleichen Netzwerk.
-
Zielverzeichnis noch nicht existieren, auf Computer2 im Dialogfeld Lizenzaktivierung, es kann also erstellt werden müssen.
-
Wenn es einfach ist, ich möchte vermeiden, schreiben Sie die Zeichenfolge aus dem RAM auf eine temporäre Datei auf Computer1. Nicht zu beseitigen, dass Lösungen, die möglicherweise verwenden Sie ein system-Aufruf von rsync?
-
Weil der string ist Binär, es könnte bytes enthalten, dass interpretiert werden könnte als ein Zeilenumbruch. Dies würde scheinen, um auszuschließen, Lösungen, die möglicherweise verwenden Sie einen system-Aufruf der echo-Befehl auf Computer2 im Dialogfeld Lizenzaktivierung.
-
Möchte ich dies so leicht auf Computer2 im Dialogfeld Lizenzaktivierung wie möglich. So, ich möchte vermeiden, laufen Dienste wie ftp auf Computer2 im Dialogfeld Lizenzaktivierung oder engagieren sich in anderen Konfigurations-Aktivitäten. Plus, ich don ' T verstehen die Sicherheit, dass auch, und so möchte vermeiden Sie das öffnen von zusätzlichen ports, es sei denn wirklich notwendig.
-
Habe ich ssh-keys einrichten, auf Computer1 und Computer2 im Dialogfeld Lizenzaktivierung und würde Sie gerne benutzen für die Authentifizierung.
-
EDIT: Rechner1 ist das ausführen mehrerer threads, und so ist es möglich, dass mehr als ein thread könnte versuchen zu schreiben, um die gleiche Datei auf Computer2 im Dialogfeld Lizenzaktivierung auf überlappende Zeiten. Ich habe nichts dagegen, die Ineffizienz verursacht durch die Datei geschrieben, zweimal (oder mehr) in diesem Fall, aber die resultierende Datei auf Computer2 im Dialogfeld Lizenzaktivierung sollte nicht beschädigt werden durch die gleichzeitige schreibt. Vielleicht einen OS-lock auf Computer2 im Dialogfeld Lizenzaktivierung benötigt wird?
Ich bin wühlen für ein rsync-Lösung, da es eine in sich geschlossene Einheit, die ich verstehe Recht gut, und erfordert keine Konfiguration auf Computer2 im Dialogfeld Lizenzaktivierung.
- Sie können werfen Sie einen Blick auf python sockets (tcp-sockets in Ihrem Fall). Was auch immer Schema müssen Sie umgesetzt werden können mit Ihnen.
- sftp scheint der wahrscheinlichste Kandidat. wiki.python.org/moin/SecureShell stackoverflow.com/questions/432385/...
- Wie lange würde es dauern, um die übertragung von 10 MB auf die andere Seite? Werden unterbrochene verbindungen, und die Wiederaufnahme wahrscheinlich? Diese Fragen relevant sein könnte, um zu entscheiden, ob Erik Allik Lösung - das wäre mein Favorit als gut benutzbar ist hier.
- Nicht ohne die Eröffnung eines zusätzlichen port - scheint unerwünscht hier. SSH-Verbindung würde wahrscheinlich besser sein...
- Bearbeitet die Frage, zu erklären, dass die Verbindung zwischen den Maschinen ist schnell.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Öffnen Sie eine neue SSH-Prozess auf Computer2 im Dialogfeld Lizenzaktivierung mit
subprocess.Popen
und dann schreiben Sie Ihre Daten, um Ihre STDIN.Ich habe gerade verifiziert, dass es funktioniert wie beworben und kopiert alle 10485760 dummy-bytes.
P. S. Eine potenziell sauberere/elegantere Lösung wäre, die Python-Programm schreibt seine Ausgabe auf
sys.stdout
statt und machen die Leitungenssh
extern:shell=True
? Eine bloßessh_cmd_list = ['ssh', 'user@machine2', 'mkdir -p output/dir; cat - > output/dir/file.dat']
gefolgt von einemp = subprocess.Popen(ssh_cmd_list, stdin=subprocess.PIPE)
macht die Sachen viel einfacher zu Lesen und entfernt eine Ebene der Komplexität, was die zusätzliche shell-Ebene wäre.ssh
habe ich Angst; aber trotzdem... ich kann nicht finden, ein Tippfehler. Im Grunde bin ich nur durch ausreichend perfektioniert code, der funktioniert; die OP ist frei, zu ändern, anzupassen, zu transformieren und zu bereinigen 🙂'foo''bar'
ist'foobar'
und so ist('foo' 'bar'
), und der Zeilenumbruch wird einfach ignoriert und die Klammern sind erforderlich, um zu vermeiden, ein \ line die Fortsetzung 🙂shell=False
- Modus, Sie don ' T haben, um den vollständigen Pfad der ausführbaren Datei -Popen()
findet es für Sie. (Siehe hier wiesubprocess.call(["ls", "-l"])
arbeitet-code, und sehen, hier für weitere Beispiele.)cat
so dass die übertragung selbst ist die gleiche; für die Datei zu sperren, finden Sie unter der pylockfile Paket.mv
es im Ort.mv
ist eine tolle Idee!Paramiko unterstützt das öffnen von Dateien auf remote-Rechnern:
/a/b/c/d
oder so), wenn auchb
oderc
noch nicht existieren...).f.write(data)
erfordert ASCII-Daten (schwer zu glauben scheint) oder weil es einfach eine gute form zu geben-Codierung, auch auf ein Beispiel-string?Wenn nur Berufung ein Teilprozess ist alles, was Sie wollen, vielleicht sh.py
könnte das richtige sein.
Eine Lösung, in der Sie nicht explizit, senden Sie Ihre Daten über eine Verbindung wäre, die Nutzung sshfs. Sie können es verwenden, mounten Sie ein Verzeichnis aus Computer2 im Dialogfeld Lizenzaktivierung irgendwo auf Computer1 und schreiben auf eine Datei in diesem Verzeichnis wird automatisch in die Daten, die geschrieben werden auf Computer2 im Dialogfeld Lizenzaktivierung.
-o reconnect
helfen würde?