PHP zu Python: Optimierung eines vorhanden Scripts

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Benutzeravatar
grubenfox
User
Beiträge: 574
Registriert: Freitag 2. Dezember 2022, 15:49

__blackjack__ hat geschrieben: Mittwoch 15. Januar 2025, 10:50 @mmueller-87: Wobei man auch bei FTP bei Python bleiben könnte — gibt ja `ftplib` in der Standardbibliothek.

@grubenfox: Auf den ersten Blick sieht `pyftplib` nach einem *Server* aus. Kann das auch Client? Denn das wird ja gebraucht.
@__blackjack__: keinen blassen Schimmer. War der erste Treffer mit etwas zu "throttle-bandwidth". Dazu hatte ich bei `ftplib` aus der Standardbibliothek auf die Schnelle nichts gefunden.

P.S: Ja, da war ich wohl falshc... `pyftplib` ist offenbar nur Server.
mmueller-87
User
Beiträge: 11
Registriert: Sonntag 11. Juni 2023, 07:25

grubenfox hat geschrieben: Mittwoch 15. Januar 2025, 10:44
mmueller-87 hat geschrieben: Mittwoch 15. Januar 2025, 10:14 Nun würde ich gerne, wenn das Python Script die Dateien hochlädt, das es eine Bandbreitenbegrenzung gibt, und "ncftp" die Dateien statt mit 3 MBits nur mit 100kBits höchlädt. Wäre das umsetzbar?
[ungetestet]
Das "Subprocess" rauswerfen (inkl. ncftp) und

Code: Alles auswählen

import pyftplib
einfügen und dort dann mit throttle-bandwidth arbeiten.

Ok, Vielen Dank, habe mich etwas eingelesen und probiere verschiedenes aus, diese Funktion funktioniert, aber mir fehlt ein bisschen das "Error handling" um zu prüfen ob die Datei hochgeladen wurde, oder der Server nicht erreichbar ist. Kann mir jemand beim anpassen helfen. Hier ein Snippet der Funktion:

Code: Alles auswählen

def ftp_upload(local_file, media_type):
    # Connect FTP Server
    ftp_server = ftplib.FTP(FTP_HOSTNAME, FTP_USERNAME, FTP_PASSWORD)
    ftp_server.encoding = "utf-8"

    # Get list of files
    # ftp_server.dir()
    # audios: /cache/receiver_b/audio/
    # thumbs: /templates/default/m3images/
    # images: /templates/default/m3images/

    # Read file in binary mode
    with open(local_file, "rb") as file:
        # Media directory
        if media_type == "audio":
            media_folder = "/cache/receiver_b/audio/"
        else:
            media_folder = "/templates/default/m3images/"

        # Command for uploading
        ftp_server.storbinary(f"STOR {media_folder}{local_file}", file)

    # Close the Connection
    ftp_server.quit()
Benutzeravatar
__blackjack__
User
Beiträge: 13808
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mmueller-87: Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

Bei `file` im Namen würde man ein Datei-Objekt erwarten und keine Zeichenkette mit einem Dateinamen.

Die Kodierung kann man einem `FTP`-Objekt schon beim erstellen mitgeben. Das UTF-8 aber schon die Voreinstellung ist, braucht man das hier nicht.

`FTP`-Objekte sind Kontextmanager, die sollte man mit ``with`` verwenden.

Zwischenstand (ungetestet):

Code: Alles auswählen

def ftp_upload(local_filename, media_type):
    with ftplib.FTP(FTP_HOSTNAME, FTP_USERNAME, FTP_PASSWORD) as ftp_server:
        with open(local_filename, "rb") as file:
            #
            # audios: /cache/receiver_b/audio/
            # thumbs: /templates/default/m3images/
            # images: /templates/default/m3images/
            #
            media_folder = (
                "/cache/receiver_b/audio/"
                if media_type == "audio"
                else "/templates/default/m3images/"
            )
            ftp_server.storbinary(f"STOR {media_folder}{local_filename}", file)
Die Fehlerbehandlung würde ich ausserhalb dieser Funktion machen. Oder was könnte/sollte die sinnvolles tun wenn die Verbindung zum Server nicht funktioniert oder die Datei nicht übertragen werden kann?

Bandbreite könnte man übrigens über die optionale Rückruffunktion begrenzen, die man bei `storbinary()` angeben kann.
Die drei Todfeinde des Programmieres:
Sonnenlicht, frische Luft und das unerträgliche Gebrüll der Vögel.
Antworten