[PYTHON] Schnelle Dateiübertragung mit Stoff

Nachtrag: Die Methode von http://qiita.com/NPoi/items/46364461f0ab76e986c3 ist intelligenter!

Ist der Stoff nicht langsam? Verwenden wir rsync. Bei der Übertragung eines gesamten Verzeichnisses mit vielen statischen Dateien wie Bildern, HTML und JS ist die Ausführungszeit von Fabric erheblich unterschiedlich, daher werde ich sie vorstellen. (Ich gehe von Leuten aus, die zum Teil Stoff verwenden)

Rsync als Nicht-Root-Benutzer

Es ist eine offizielle Funktion von Stoff, daher ist es einfach zu bedienen.

from fabric.contrib.project import rsync_project

@task
def hoge():
	rsync_project(
		local_dir='./mydir',
		remote_dir='/usr/local/destination/mydir',
		exclude=['.DS_Tore', '*.tmp'],
		delete=True
	)

rsync als Root-Benutzer

Nach dem Synchronisieren als Nicht-Root-Benutzer können Sie "mv" oder "cp -r" ausführen. Das Schöne an rsync ist jedoch, dass Sie nur die Unterschiede übertragen können. Deshalb habe ich diese Funktion erstellt. Die Argumente sind auf "rsync_project" ausgerichtet.

Die Operation besteht darin, einmal mit / tmp / (Hash-Wert des Verzeichnisnamens) / und dann "sudo rsync" auf dem Server zu synchronisieren.

Es hängt von der is_dir-Funktion von fabtools ab, daher benötigen Sie pip install fabtools

import hashlib
from fabric.api import local, run, sudo
from fabric.contrib.project import rsync_project
from fabtools.files import is_dir

def root_rsync(local_dir, remote_dir, exclude=[], delete=False):
	def _end_with_slash(dir_path):
    	if dir_path[-1] == '/':
    	    return dir_path
    	else:
    	    return dir_path + '/'
    local_dir = _end_with_slash(local_dir)
    remote_dir = _end_with_slash(remote_dir)
    m = hashlib.md5()
    m.update(remote_dir)
    me = local('whoami', capture=True)
    remote_tmp_dir = '/tmp/%s/%s/' % (me, m.hexdigest())
    run('mkdir -p %s' % remote_tmp_dir)
    if is_dir(remote_dir):
        run('rsync -a %s %s' % (remote_dir, remote_tmp_dir))  # already exists
    rsync_project(
        remote_dir=remote_tmp_dir,
        local_dir=local_dir,
        exclude=exclude,
        delete=delete
    )
    sudo('rsync -a %s %s' % (remote_tmp_dir, remote_dir))

Recommended Posts

Schnelle Dateiübertragung mit Stoff
Bidirektionale Dateiübertragung in Pythonista 3
Paramiko + scp Einführung ~ SSH-Verbindung ~ Dateiübertragung mit SCP
Dateivorgang mit open - "../"
Datei-Upload mit Django
Zeichnen Sie eine netCDF-Datei mit Python
Dateien mit teraterm übertragen [Hinweis]
Datei-Upload mit Flask + jQuery
Laden Sie die CSV-Datei mit Python herunter
Erstellen Sie eine Xlsx-Datei mit XlsxWriter
Führen Sie mehrstufige SSH mit Fabric durch
Extrahieren Sie die xz-Datei mit Python
Holen Sie sich Informationen zu Videodateien mit ffmpeg-python
[Python] Mit Python in eine CSV-Datei schreiben
[Mit Python automatisiert! ] Teil 1: Datei einstellen
Implementierter Dateidownload mit Python + Bottle
Erstellen Sie eine Deb-Datei mit Docker
Ausgabe in eine CSV-Datei mit Python
Servieren Sie statische Dateien mit X-Send File
Geben Sie Stoff gleich mit Küche
Laden Sie die mit appcfg.py bereitgestellte Datei herunter
Automatisierung von Remote-Operationen mit Fabric
Verwenden Sie die Kamerakalibrierungsdatei mit OpenCvSharp4
Ich konnte Gunicorn mit Fabric nicht zu einem Dämon machen
[Mit Python automatisiert! ] Teil 2: Dateivorgang
Datei mit Standard-App öffnen
Einfache Bereitstellungsumgebung mit Gaffer + Fabric
Erstellen Sie mit Django einen Datei-Uploader