Topic: Copia files su USB da percorso di rete  (Letto 264 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline The_Aztek

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Copia files su USB da percorso di rete
« il: Marzo 02, 2022, 09:04 »
Buongiorno a tutti,
ho creato una maschera con tkinter che ha un input che viene memorizzato in una variabile, questa variabile definisce parte del percorso di rete di una cartella che dovrò copiare in una chiavetta USB; in pratica devo caricare un firmware nella chiavetta diverso a seconda del codice inserito.

Il mio problema è che non riesco a puntare al percorso della cartella, in quanto mi da un errore di "Permission denied" nonostante la cartella sia perfettamente accessibile a chiunque.

Incollo il codice qui sotto, la variabile fw_output mi arriva dalla maschera di tkinter e contiene una parte del percorso della cartella che contiene i file da caricare nella chiavetta


import os
import shutil

sorgente = ("w:/00-DOCUMENTAZIONE/019-FIRMWARE/"+fw_output+"/UPLOAD/")  #fw_output arriva da una funzione e contiene il codice della cartella firmware
destinazione = ("e:/")      #chiave USB
#ho dovuto mettere / perchè se uso la backslash mi da errore
print (sorgente)            #stampo il percorso per verifica
print (destinazione)        #stampo il percorso per verifica

files=os.listdir(sorgente)  #solo per verifica, controllo se riesco a leggere nella cartella
print(files)

for f in files:
    src=sorgente+f
    dst=destinazione+f
    shutil.copy(src,dst)


Qualche suggerimento?

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 624
  • Punti reputazione: 0
    • Mostra profilo
Re:Copia files su USB da percorso di rete
« Risposta #1 il: Marzo 02, 2022, 12:42 »
Ciao @Aztek, ben venuto

Innanzi tutto, dovresti precisare il contesto di esecuzione, a partire dal Tuo sistema operativo che, dal codice, si desume essere windows, ambiente che personalmente non utilizzo da vent'anni, anche se ultimamente di tanto in tanto lo "guardo" di sfuggita.

Inoltre, quando si hanno degli errori di esecuzione è sempre bene/utile postare il traceback che si riceve, se molto consistente almeno le parti "notevoli" per permettere a chi legge di farsi una idea più o meno approssimativa del problema.

Per altro non si capisce bene cosa sia questo "firmware" da caricare (suppongo un insieme di files) e se la chiavetta sia effettivamente collegata al computer o meno (quel "percorso di rete")

Comunque, pur non praticando windows, nel corso di un intervento in un altro post ho riscontrato che il "Permission denied" sovente lo si riceve perché si scrive una directory che si "legge" nella finestra del file-system mentre in realtà tale testo è un dato descrittivo di un diverso nome "reale" nel file-system.
Dato che utilizzi tkinter potresti provare ad aprire con le finestre di dialogo preposte le directory/files sorgenti e di destinazione, utilizzando il metodo "join" di os.path per definire ulteriori percorsi (path) da utilizzare.
Provaci, se poi hai problemi fai sapere, specificando esattamente le condizioni d'uso che condizionano l'applicazione.

Ciao

Offline The_Aztek

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Copia files su USB da percorso di rete
« Risposta #2 il: Marzo 02, 2022, 12:53 »
Ciao @nuzzopippo,
ti confermo che il firmware è una serie di cartelle/files contenuti in una cartella che ha lo stesso nome dell'input che gli passo e che si, trattasi di windows e la chiavetta deve essere collegata prima di lanciare

Questa la copia del trackback dell'errore:

Si è verificata un'eccezione: FileNotFoundError
Si è verificata un'eccezione: PermissionError
[Errno 13] Permission denied: 'w:/00-DOCUMENTAZIONE/019-FIRMWARE/52FWR00017-000/UPLOAD/jpg'
  File "C:\Users\utente1\Desktop\Python\fware_003.py", line 131, in <module>
    shutil.copy(src,dst)


Non ho capito questa tua parte, porta pazienza ma sono un principiante...
Citazione da: nuzzozippo
Comunque, pur non praticando windows, nel corso di un intervento in un altro post ho riscontrato che il "Permission denied" sovente lo si riceve perché si scrive una directory che si "legge" nella finestra del file-system mentre in realtà tale testo è un dato descrittivo di un diverso nome "reale" nel file-system.
Dato che utilizzi tkinter potresti provare ad aprire con le finestre di dialogo preposte le directory/files sorgenti e di destinazione, utilizzando il metodo "join" di os.path per definire ulteriori percorsi (path) da utilizzare.
Provaci, se poi hai problemi fai sapere, specificando esattamente le condizioni d'uso che condizionano l'applicazione.

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 624
  • Punti reputazione: 0
    • Mostra profilo
Re:Copia files su USB da percorso di rete
« Risposta #3 il: Marzo 02, 2022, 18:11 »
Non ho capito questa tua parte, porta pazienza ma sono un principiante...

Aiah ... forse Ti stai avventurando su di un terreno impervio senza essere pronto.

Comunque, di fatto devi copiare un file, o magari delle directory ricorsivamente in un qualsiasi punto raggiungibile dal computer (n.b. : la domanda sulla chiavetta era se fosse inserita sul TUO computer, oppure su di un altro) ... Ti ho preparato un semplice esempio di una finestra tkinter capace di copiare un singolo file, oppure tutti i file contenuti in una directory, oppure ricorsivamente tutti i files e sub-directory (con il loro contenuto) contenute in una directory, lo ho verificato su windows 10 e funziona, ovviamente se hai libero accesso su tutto il della directory o del file sorgente ... se lo provi sulla Tua cartella "Documenti" (che per altro non potresti copiare perché avresti errore per numerosi accessi negati) vedrai che si chiama diversamente.
il codice:
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog as fd
from tkinter import simpledialog as sd
from tkinter import messagebox as mb
import os
import shutil

class MyApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.source = ''
        self.destiny = ''
        self._populate()
       
    def _populate(self):
        self.title('Prova copia in Windows')
        self.copy_dir = tk.BooleanVar()
        self.copy_recursive = tk.BooleanVar()
        opt_pan = tk.Frame(self)
        opt_pan.grid(row=0, column=0, sticky='ew')
        self.ck_dir = tk.Checkbutton(opt_pan, text='Copia directory',
                                     onvalue=True, offvalue=False,
                                     variable=self.copy_dir)
        self.ck_dir.grid(row=0, column=0, padx=4, pady=4, sticky='w')
        self.ck_recursive =  tk.Checkbutton(opt_pan, text='Copia ricorsiva',
                                            onvalue=True, offvalue=False,
                                            variable=self.copy_recursive)
        self.ck_recursive.grid(row=0, column=1, padx=4, pady=4, sticky='w')
        opt_pan.grid_columnconfigure(0, weight=1, uniform='toopt')
        opt_pan.grid_columnconfigure(1, weight=1, uniform='toopt')
        report_pan = tk.Frame(self)
        report_pan.grid(row=1, column=0, sticky='nsew')
        lbl = tk.Label(report_pan, text='Sorgente :', font='bold', justify='left')
        lbl.grid(row=0, column=0, padx=4, pady=(10,4), sticky='w')
        self.l_source = tk.Label(report_pan, text='Non definita', justify='left')
        self.l_source.grid(row=1, column=0, padx=4, pady=(4,10), sticky='w')
        lbl = tk.Label(report_pan, text='Destinazione :', font='bold', justify='left')
        lbl.grid(row=2, column=0, padx=4, pady=(10,4), sticky='w')
        self.l_destiny = tk.Label(report_pan, text='Non definita', justify='left')
        self.l_destiny.grid(row=3, column=0, padx=4, pady=(4,10), sticky='w')
        report_pan.grid_columnconfigure(0, weight=1)
        bt_pan = tk.Frame(self)
        bt_pan.grid(row=2, column=0, sticky='ew')
        bt_origin = tk.Button(bt_pan, text='Apri sorgente', command=self._on_source)
        bt_origin.grid(row=0, column=0, padx=4, pady=4, sticky='ew')
        bt_dest = tk.Button(bt_pan, text='Apri destinazione', command=self._on_destination)
        bt_dest.grid(row=0, column=1, padx=4, pady=4, sticky='ew')
        bt_add_dir = tk.Button(bt_pan, text='Aggiungi directories', command=self._add_dirs)
        bt_add_dir.grid(row=0, column=2, padx=4, pady=4, sticky='ew')
        bt_copy = tk.Button(bt_pan, text='Copia', command=self._on_copy)
        bt_copy.grid(row=0, column=3, padx=4, pady=4, sticky='ew')
        bt_end = tk.Button(bt_pan, text='Esci', command=self.destroy)
        bt_end.grid(row=0, column=4, padx=4, pady=4, sticky='ew')
        for i in range(5):
            bt_pan.grid_columnconfigure(i, weight=1, uniform='tobtn')
   
    def _on_source(self):
        if self.copy_dir.get():
            target = fd.askdirectory(parent=self,
                                     initialdir=os.path.expanduser('~'),
                                     title='Directory sorgente')
        else:
            target = fd.askopenfilename(parent=self,
                                        initialdir=os.path.expanduser('~'),
                                        title='File da copiare')
        if not target: return
        self.l_source.configure(text=target)
   
    def _on_destination(self):
        target = fd.askdirectory(parent=self,
                                    initialdir=os.path.expanduser('~'),
                                    title='Directory destinazione')
        if target:
            self.l_destiny.configure(text=target)
   
    def _add_dirs(self):
        msg = 'Iserire una o più directory separate da ";"'
        adds = sd.askstring('Aggiunta directory', msg)
        if not adds: return
        d = self.l_destiny['text']
        for s in adds.split(';'):
            d = os.path.join(d, s)
        self.l_destiny.configure(text=d)
   
    def _on_copy(self):
        if self.l_source == 'Non definita': return
        if self.l_destiny == 'Non definita': return
        origin = self.l_source['text']
        dest = self.l_destiny['text']
        try:
            if self.copy_dir.get():
                if self.copy_recursive.get():
                    shutil.copytree(origin, dest, copy_function=shutil.copy,
                                    dirs_exist_ok=False)
                else:
                    if not os.path.exists(dest) or not os.path.isdir(dest):
                        os.makedirs(dest)
                    self._copy_all_files(origin, dest)
            else:
                if not os.path.exists(dest) or not os.path.isdir(dest):
                    os.makedirs(dest)
                f_name = os.path.basename(origin)
                shutil.copy(origin, os.path.join(dest, f_name))
        except OSError as e:
            mb.showerror('Errore copia', repr(e))
   
    def _copy_all_files(self, origin, dest):
        sources = os.listdir(origin)
        if not sources:
            mb.showinfo('Processo di copia', 'Nessun contenuto in %s' % origin)
            return
        try:
            for f in sources:
                if os.path.isfile(os.path.join(origin, f)):
                    shutil.copy(os.path.join(origin, f),
                                os.path.join(dest, f))
        except OSError as e:
            mb.showerror('Errore copia', repr(e))





if __name__ == '__main__':
    app = MyApp()
    app.mainloop()

Provalo, studialo e cerca di comprenderlo, in particolare studiati i metodi di "os" utilizzati e perché, spiegarlo richiederebbe un mezzo libro.

Spero Ti sia utile, ciao

Offline The_Aztek

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Copia files su USB da percorso di rete
« Risposta #4 il: Marzo 04, 2022, 10:34 »
Ciao @Nuzippo,
scusami il ritardo nella risposta :)
Si so di essermi infilato in un vespaio, ma in qualche modo ne uscirò  :D
Ti ringrazio per il codice che mi hai passato, tra oggi e domani me lo studio per bene e poi ti darò riscontro.
Grazie mille!!