title: Introduzione al coding subtitle: Dialoghi con un modello di linguaggio author: Andrea Fazzi date: 10.02.2024
Attraverso il dialogo con un LLM (Large Language Model) si introdurranno i concetti fondamentali del coding a partire da un semplice script Python che implementa un cifrario di Cesare. Il modello di linguaggio utilizzato è phind_v10_model.
Io: In che linguaggio è scritto il seguente programma?
def cesar_cipher(text, key):
result = ""
for i in range(len(text)):
char = text[i]
if char.isupper():
result += chr((ord(char) - 65 + key) % 26 + 65)
else:
result += chr((ord(char) - 97 + key) % 26 + 97)
return result
text = input("Inserisci il testo da cifrare: ")
key = int(input("Inserisci la chiave: "))
print("Testo cifrato: ", cesar_cipher(text, key))
llm: Il programma è scritto in Python.
Io: Parlami in maniera succinta del linguaggio di programmazione Python (massimo 100 parole).
llm: Python è un linguaggio di programmazione ad alto livello, interpretato e orientato agli oggetti. Creato da Guido van Rossum nel 1991, è noto per la sua sintassi leggibile e semplice, simile al linguaggio inglese, con influenze matematiche. È dinamicamente tipizzato e gestisce l'allocazione della memoria. Supporta vari stili di programmazione, tra cui procedurale, funzionale e orientato agli oggetti. Python è spesso utilizzato per lo sviluppo rapido di applicazioni, l'automazione, l'elaborazione dei dati e l'apprendimento automatico. Ha una vasta gamma di librerie standard e un'ampia comunità di sviluppatori.
Io: Descrivimi lo script. Cosa fa?
llm: Lo script Python che hai fornito è un'implementazione di un cifrario di Cesare, un metodo di crittografia di sostituzione molto semplice. Il cifrario di Cesare sposta ogni lettera dell'alfabeto di un numero fissato di posizioni. Ad esempio, con una chiave di 1, 'A' diventa 'B', 'B' diventa 'C', ecc.
Ecco come funziona lo script:
cesar_cipher
prende due argomenti: text
, la stringa
da cifrare, e key
, la chiave di cifratura.Io: Nello script sono utilizzati diversi concetti relativi al coding in generale. Sono presenti, ad esempio, alcune variabili alle quali vengono assegnati dei valori. A partire dallo script, spiegami in maniera succinta
llm:
=
[0][1].=
. Ad esempio, result = ""
assegna una stringa
vuota alla variabile result
. In Python, è possibile assegnare
valori di diversi tipi di dati a una variabile e il tipo di dato
verrà determinato automaticamente [0][1].text
: è una stringa, poiché contiene testo che l'utente
inserirà tramite l'input.key
: è un intero, poiché l'input dell'utente viene convertito
in un numero intero con int()
.char
: è un carattere, poiché estrai singoli caratteri dalla
stringa text
.result
: è anch'essa una stringa, poiché accumula i caratteri
cifrati [0][2].Io: Proponimi un esercizio per mettere in pratica l'utilizzo delle variabili in Python. L'esercizio dev'essere coerente con quanto mi hai spiegato in precedenza. Insieme alla traccia dell'esercizio, genera una soluzione in Python.
llm:
Esercizio:
Scrivi uno script Python che calcoli l'area di un cerchio dato il raggio. Utilizza una variabile per memorizzare il raggio e un'altra per memorizzare l'area. Stampa l'area sul terminale.
Soluzione:
# Assegnazione del raggio alla variabile 'raggio'
raggio = 5
# Calcolo dell'area del cerchio utilizzando la formula:
# area = pi * raggio^2
# Nota: In Python, 'pi' è rappresentato come math.pi
import math
area = math.pi * raggio ** 2
# Stampa dell'area sul terminale
print("L'area del cerchio con raggio", raggio, "è", area)
Io: Nello script è presente un ciclo for
. Parlami di questo
costrutto e di come viene utilizzato nello script.
llm: Nello script Python fornito, il costrutto for
viene
utilizzato per iterare su una sequenza, in particolare una
stringa. Questo costrutto è comune in Python e funziona come un
iteratore, consentendo di eseguire un blocco di codice per ogni
elemento in una sequenza, come una lista, una tupla, un dizionario, un
insieme o una stringa [0][1][2][3].
Ecco come viene utilizzato nel tuo script:
for i in range(len(text)):
- Il ciclo for
itera sulla lunghezza
della stringa text
utilizzando la funzione range()
, che genera
una sequenza di numeri. In questo caso, i
assume il valore di ogni
indice nella stringa text
durante l'iterazione [2][3].char = text[i]
assegna il carattere
corrispondente all'indice i
alla variabile char
.result
, che viene poi
stampata alla fine dello script.Quindi, il ciclo for
in questo script è fondamentale per applicare
la cifratura di Cesare a ciascun carattere del testo fornito
dall'utente.
Io: Esistono altri modi per costruire in Python parti di codice iterative? Potresti prima elencarle e poi descrivermele succintamente?
llm: Esistono diversi modi per costruire parti di codice iterative
in Python oltre al ciclo for
. Ecco alcuni dei più comuni:
while
: Si utilizza quando non si conosce in anticipo quante
volte il ciclo deve essere eseguito, ma si sa solo quando deve
terminare [1].Io: Potresti riscrivere lo script utilizzando un ciclo while
al
posto del for
?
llm: Per riscrivere lo script utilizzando un ciclo while
invece
del for
, puoi seguire questi passaggi:
i
, con valore 0.while
che controlla se i
è
minore della lunghezza della stringa text
.while
, esegui il codice che era
precedentemente all'interno del ciclo for
, assicurandoti di
aggiornare il valore di i
alla fine di ogni iterazione.i
sia incrementato di 1.Ecco come potrebbe apparire lo script modificato:
def cesar_cipher(text, key):
result = ""
i = 0
while i < len(text):
char = text[i]
if char.isupper():
result += chr((ord(char) - 65 + key) % 26 + 65)
else:
result += chr((ord(char) - 97 + key) % 26 + 97)
i += 1
return result
text = input("Inserisci il testo da cifrare: ")
key = int(input("Inserisci la chiave: "))
print("Testo cifrato: ", cesar_cipher(text, key))
In questo modo, il ciclo while
continua a eseguire il blocco di
codice fino a quando i
è inferiore alla lunghezza del testo, che è
equivalente al comportamento del ciclo for
originale.
Io: Proponimi un esercizio nel quale sia necessario utilizzare un
ciclo for
. Genera la soluzione dell'esercizio.
llm:
Scrivi uno script Python che stampi la somma dei primi n numeri naturali, dove n è un numero intero fornito dall'utente.
Traccia dell'esercizio:
n
.for
per sommare i numeri da 1 a n
.Soluzione in Python:
# Chiedi all'utente di inserire un numero intero
n = int(input("Inserisci un numero intero: "))
# Inizializza una variabile per tenere traccia della somma
somma = 0
# Utilizza un ciclo for per sommare i numeri da 1 a n
for i in range(1, n + 1):
somma += i
# Stampa la somma ottenuta
print("La somma dei primi", n, "numeri naturali è", somma)
Io: E' possibile scrivere un'implementazione ricorsiva dello stesso esercizio? Potresti eventualmente generarla e spiegarmi passo passo come funziona?
llm:
Esercizio: Scrivi uno script Python che, data un'intera positiva n
,
calcoli la somma dei primi n
numeri naturali.
Soluzione in Python:
def sum_of_naturals(n):
# Caso base per la ricorsione: se n è 0, la somma è 0
if n == 0:
return 0
# Somma del numero corrente più la somma dei numeri successivi
else:
return n + sum_of_naturals(n - 1)
n = int(input("Inserisci un numero intero positivo: "))
print("La somma dei primi", n, "numeri naturali è", sum_of_naturals(n))
In questa soluzione, la funzione sum_of_naturals
è una funzione
ricorsiva che calcola la somma dei primi n
numeri naturali. La
ricorsione avviene quando la funzione si chiama se stessa con un
valore ridotto di n
(da n
a n - 1
) fino a raggiungere il caso
base in cui n
è 0, altrimenti la somma viene calcolata sommando n
al risultato della chiamata ricorsiva.
Io: Parlami delle strutture dati in Python. Quali sono le principali?
llm:
In Python, le strutture dati sono fondamentali per l'organizzazione e la manipolazione dei dati. Le principali strutture dati in Python includono:
Liste: Sono collezioni ordinate e mutabili di elementi. Possono contenere elementi di diversi tipi. Le liste supportano operazioni come l'aggiunta, la rimozione e l'ordine degli elementi. Possono anche essere usate come pile, dove l'ultimo elemento aggiunto è il primo a essere rimosso (Last-In, First-Out) [5.1.1].
Tuple: Simili alle liste, ma sono immutabili. Le tuple possono essere usate per raggruppare dati correlati e possono essere utilizzate come chiavi in un dizionario. Le tuple possono essere create con una sintassi particolare per le tuple vuote e quelle con un solo elemento [5.3].
Dizionari: Sono collezioni non ordinate di elementi immutabili. Ogni elemento in un dizionario è una coppia chiave-valore. I dizionari sono utilizzati per memorizzare dati in modo chiave-valore e supportano operazioni come l'aggiunta, la rimozione e la ricerca di elementi [5.5].
Set: Sono collezioni non ordinate e immutabili di elementi unici. I set supportano operazioni come l'aggiunta, la rimozione e la ricerca di elementi. I set possono essere utilizzati per eliminare i duplicati da una sequenza [5.4].
Python offre anche tecniche di iterazione per lavorare con queste
strutture dati, come l'uso di items()
per iterare su un dizionario,
enumerate()
per iterare su una sequenza con indici, e zip()
per
iterare su due o più sequenze contemporaneamente. Per iterare su una
sequenza in ordine inverso, si può usare reversed()
, e per iterare
in modo ordinato, si può usare sorted()
[5.6].
Le liste possono essere estese con operazioni come l'aggiunta di
elementi alla fine con append()
, l'inserimento di elementi in una
posizione specifica con insert()
, e la rimozione di elementi con
pop()
o del
[5.1.1][5.2].
Le List Comprehension sono un modo conciso per creare liste basate su altre liste o iterabili, con la possibilità di includere condizioni. Sono particolarmente utili per creare nuove liste da esistenti in modo efficiente [5.1.3].
Infine, Python supporta il confronto tra sequenze e altri tipi di dati, permettendo confronti lessicografici tra elementi di sequenze dello stesso tipo. Questo è utile per l'ordinamento e la comparazione di dati [5.8].
Io: Produci un semplice programma in Python che a partire da un array di numeri ne produca uno che contiene gli stessi elementi in ordine inverso. Attenzione: Usa i cicli e non le slice o le funzioni della libreria standard. L'esempio dev'essere utile per comprendere:
llm:
# Array originale
numbers = [2, 4, 9, 11, 8, 3, 2, 5, 10]
# Creazione di un nuovo array vuoto per l'array invertito
numbers_rev = []
# Calcolo della lunghezza dell'array originale
numLength = len(numbers)
# Iterazione attraverso l'array originale in ordine inverso
for i in range(numLength):
# Calcolo dell'indice corrispondente nell'array invertito
# Poiché stiamo inizializzando da 0, l'indice nell'array invertito sarà la lunghezza dell'array originale meno 1 meno l'indice corrente
index_invertito = numLength - 1 - i
# Inserimento dell'elemento corrente dell'array originale nell'array invertito
numbers_rev.append(numbers[index_invertito])
# Stampa dell'array invertito
print(numbers_rev)
Io: Ora scrivi un programma simile che inverta una stringa. Tratta la stringa come un array di carattere. Incapsula l'algoritmo all'interno di una funzione.
llm:
def inverte_stringa(text):
result = ""
for i in range(len(text)):
result += text[len(text)-1-i]
return result
# Esempio di utilizzo
stringa_originale = "Ciao Mondo"
stringa_invertita = inverte_stringa(stringa_originale)
print("La stringa originale è:", stringa_originale)
print("La stringa invertita è:", stringa_invertita)
Io: Conosci l'algoritmo denominato "bubble sort"? Potresti spiegarmelo concisamente e utilizzando uno stile socratico?
llm:
L'algoritmo del "Bubble Sort" è noto per essere uno dei metodi di ordinamento più semplici. Come Socrate, posso guidarti attraverso il processo di comprensione di come funziona, usando domande per stimolare il pensiero critico.
Immagina di avere una serie di oggetti, come per esempio delle palle, e ognuna di queste palle ha un peso diverso. Il tuo obiettivo è ordinare queste palle dal peso più leggero al peso più pesante. Come potresti fare?
Questo processo è esattamente come funziona il Bubble Sort. Ad ogni passaggio, l'algoritmo sposta gli elementi più pesanti (nel senso del valore più alto) verso il "fondo" dell'array. Ricorda, che questo metodo non è il più efficiente per grandi insiemi di dati, ma è un ottimo punto di partenza per comprendere come funzionano gli algoritmi di ordinamento.
Per illustrare meglio, immagina di avere un array di numeri: [5, 3,
8, 4, 2, 6, 9]
. Dopo il primo passaggio, avrai [3, 5, 4, 2, 6, 8,
9]
, dopo il secondo [3, 4, 2, 5, 6, 8, 9]
, e così via, fino a
quando l'array non è più ordinato, ovvero [2, 3, 4, 5, 6, 8, 9]
.
Ricorda, come Socrate amava sottolineare, la conoscenza è la chiave per capire meglio il mondo. Quindi, prova a implementare il Bubble Sort da solo e osserva come funziona con vari array di numeri. Questo ti aiuterà a cogliere meglio il concetto e a sviluppare una comprensione più profonda degli algoritmi di ordinamento.
Io: Ora proponimi una semplice implementazione in Python. Non usare funzioni di libreria.
llm:
def bubbleSort(arr):
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = True
if not swapped:
break
# Esempio di utilizzo
arr = [64, 34, 25, 12, 22, 11, 90]
bubbleSort(arr)
print("Array ordinato:", arr)
Io: Torniamo al nostro script originario, l'implentazione del cifrario di Cesare. Usa questo esempio per parlarmi delle funzioni in Python.
def cesar_cipher(text, key):
result = ""
i = 0
while i < len(text):
char = text[i]
if char.isupper():
result += chr((ord(char) - 65 + key) % 26 + 65)
else:
result += chr((ord(char) - 97 + key) % 26 + 97)
i += 1
return result
text = input("Inserisci il testo da cifrare: ")
key = int(input("Inserisci la chiave: "))
print("Testo cifrato: ", cesar_cipher(text, key))
llm:
Lo script Python fornito implementa un cifrario di Cesare, un metodo semplice di cifratura che sposta i caratteri del testo di un numero di posizioni determinato dalla chiave. Ecco una spiegazione sintetica sull'utilizzo delle funzioni in Python basata sullo script:
Definizione della funzione: La funzione cesar_cipher
è
definita con la parola chiave def
, seguita dal nome della funzione
e parentesi contenenti i parametri text
e key
. Questa funzione è
un blocco di codice che viene eseguito solo quando viene chiamata,
come spiegato in [Source 0] e [Source 1].
Parametri della funzione: La funzione accetta due parametri:
text
, che è il testo da cifrare, e key
, che è la chiave di
cifratura. Questi parametri sono passati alla funzione quando viene
chiamata, come indicato in [Source 1] e [Source 3].
Corpo della funzione: All'interno della funzione, viene
inizializzato un risultato vuoto (result = ""
) e un indice i
a 0. Quindi, entro un ciclo while
, la funzione itera su ogni
carattere del testo. Se il carattere è maiuscolo, viene cifrato
sottraendo 65 (valore ASCII di 'A'), aggiungendo la chiave, e poi
riportando il risultato nel range di valori ASCII di 'A' a 'Z'
utilizzando l'operatore modulo (% 26
). Se il carattere è
minuscolo, viene cifrato in modo simile, ma utilizzando 97 (valore
ASCII di 'a') e 122 (valore ASCII di 'z') come base. Questo processo
di cifratura è specifico per il cifrario di Cesare e si basa
sull'uso della funzione chr
per convertire i codici ASCII in
caratteri.
Ritorno del risultato: Alla fine del ciclo, la funzione
restituisce il risultato cifrato (return result
). Questo vale per
tutte le funzioni in Python che devono restituire un valore; se non
viene specificato un valore di ritorno, la funzione restituisce
None
di default, come descritto in [Source 3].
Chiamata della funzione: Dopo la definizione della funzione, il
codice richiede all'utente di inserire il testo da cifrare e la
chiave, utilizzando la funzione input
. Questi valori vengono poi
passati alla funzione cesar_cipher
per cifrare il testo. Infine,
il risultato cifrato viene stampato con print
.
Questo script illustra come definire, chiamare e utilizzare funzioni in Python per eseguire compiti specifici, come la cifratura di testo, permettendo di riutilizzare il codice e migliorare la leggibilità e la manutenibilità del programma.
Io: Ci sono altri modi per passare argomenti ad una funzione?
I "named arguments" o "keyword arguments" in Python sono un modo flessibile e potente per passare argomenti a una funzione, permettendo di specificare i valori in base al nome dell'argomento invece che alla posizione. Questo approccio può migliorare la leggibilità del codice e rendere il passaggio di argomenti più esplicito, specialmente quando una funzione ha molti parametri o quando gli argomenti non sono facilmente identificabili dalla loro posizione.
I "named arguments" sono definiti passando i valori direttamente dopo il nome del parametro nella chiamata della funzione. Questo consente di omettere alcuni argomenti se hanno valori predefiniti nella definizione della funzione, e di passare gli argomenti in qualsiasi ordine, purché siano specificati per nome. Ad esempio:
def my_function(a, b, c=0):
print(a, b, c)
my_function(a=1, b=2) # c=0 perché non è specificato
my_function(b=2, a=1, c=3) # Ordine arbitrario
def print_person_info(name, age, city):
print(f"Name: {name}, Age: {age}, City: {city}")
print_person_info(name="Alice", age=30, city="New York")
In questo esempio, name
, age
, e city
sono argomenti
"named". Questo approccio rende il codice più chiaro e meno propenso
agli errori, specialmente quando si lavora con funzioni complesse o
con molte variabili.
Io: Produci un esempio di utilizzo dei keyword arguments partendo dallo script originario del cifrario di Cesare.
llm:
Per adattare lo script del cifrario di Cesare all'uso dei "keyword
arguments" (o "named arguments"), modificheremo la funzione
cesar_cipher
per accettare gli argomenti in base al loro nome,
invece che alla loro posizione. Questo approccio migliora la
leggibilità e la flessibilità del codice, specialmente quando si
lavora con funzioni che hanno molti parametri o quando si desidera
passare argomenti in un ordine diverso da quello in cui sono stati
definiti.
Ecco come potrebbe apparire la funzione modificata:
def cesar_cipher(text, key):
result = ""
i = 0
while i < len(text):
char = text[i]
if char.isupper():
result += chr((ord(char) - 65 + key) % 26 + 65)
else:
result += chr((ord(char) - 97 + key) % 26 + 97)
i += 1
return result
# Chiamata della funzione utilizzando keyword arguments
text = "Inserisci il testo da cifrare"
key = 3
print("Testo cifrato: ", cesar_cipher(text=text, key=key))
In questo esempio, la chiamata alla funzione cesar_cipher
utilizza
"keyword arguments" specificando text=text
e key=key
. Questo
approccio rende il codice più chiaro e esplicito su quale valore
corrisponde a quale parametro, facilitando la lettura e la
manutenzione del codice.
I "keyword arguments" sono particolarmente utili quando si hanno funzioni con molti parametri, consentendo di passare gli argomenti in qualsiasi ordine e di specificare solo quelli che si desidera modificare, mantenendo gli altri ai loro valori predefiniti. Questo approccio è particolarmente utile in Python, dove la flessibilità nella definizione e chiamata delle funzioni è una delle sue caratteristiche principali.
*args
) e
gli argomenti di lunghezza variabile (**kwargs
), per creare
funzioni estremamente flessibili e potenti.In sintesi, i "named arguments" in Python offrono una potente e flessibile modalità per passare argomenti a una funzione, migliorando la leggibilità e la manutenibilità del codice.
In questa sezione verranno presentati e discussi alcuni script che risolvono problematiche realistiche nell'ambito dell'amministrazione di sistemi GNU/Linux.
Io: Proponimi un semplice script per effettuare il backup di una cartella.
Basandomi sulle informazioni fornite, ecco un semplice script Python
che può essere utile per l'amministrazione di un sistema Linux. Questo
script utilizzerà il modulo os
per eseguire comandi di sistema e il
modulo datetime
per ottenere informazioni sulla data e l'ora,
rendendolo un esempio pratico di come Python può essere utilizzato per
automatizzare compiti di amministrazione di sistema.
Lo script mostrerà l'utilizzo di Python per eseguire un backup di un file specifico e stampare il risultato, insieme alla data e l'ora del backup, rendendolo utile per la gestione dei file e l'automazione dei compiti di amministrazione.
import os
import datetime
def backup_file(file_path, backup_dir):
"""
Esegue il backup di un file specificato e lo salva in una directory di backup.
Parametri:
file_path (str): Percorso del file da eseguire il backup.
backup_dir (str): Percorso della directory dove salvare il backup.
Ritorna:
None
"""
# Controlla se la directory di backup esiste
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
# Costruisce il percorso del file di backup
backup_file_path = os.path.join(backup_dir, os.path.basename(file_path))
# Esegue il backup del file
os.system(f"cp {file_path} {backup_file_path}")
# Stampa informazioni sul backup
print(f"Backup eseguito il {datetime.datetime.now()} per il file {file_path}")
print(f"File di backup salvato in: {backup_file_path}")
# Esempio di utilizzo
file_to_backup = "/path/to/your/file.txt"
backup_directory = "/path/to/backup/directory"
backup_file(file_to_backup, backup_directory)
Questo script definisce una funzione backup_file
che accetta due
argomenti: file_path
per il percorso del file da eseguire il backup
e backup_dir
per la directory dove salvare il backup. Utilizza il
modulo os
per verificare l'esistenza della directory di backup e per
eseguire il comando di copia (cp
) per il backup del file. Inoltre,
utilizza il modulo datetime
per ottenere la data e l'ora corrente,
stampando queste informazioni insieme al risultato del backup.
Questo esempio dimostra come Python può essere utilizzato per eseguire compiti di amministrazione di sistema, come la gestione dei file e l'automazione di compiti come il backup dei file, rendendo il processo più efficiente e gestibile.
Io:
Produci uno script con le stesse funzionalità ma scritto in Bash. Paragona i due script.
llm:
Per convertire lo script Python in uno script Bash, è importante capire le funzionalità chiave dello script originale e come queste possono essere implementate in un contesto Bash. Lo script Python esegue il backup di un file specificato copiandolo in una directory di backup e stampando informazioni sul backup. Ecco come potrebbe essere scritto in Bash:
#!/bin/bash
# Funzione per eseguire il backup di un file
backup_file() {
file_path="$1"
backup_dir="$2"
# Controlla se la directory di backup esiste
if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir"
fi
# Costruisce il percorso del file di backup
backup_file_path="$backup_dir/$(basename "$file_path")"
# Esegue il backup del file
cp "$file_path" "$backup_file_path"
# Stampa informazioni sul backup
echo "Backup eseguito il $(date) per il file $file_path"
echo "File di backup salvato in: $backup_file_path"
}
# Esempio di utilizzo
file_to_backup="/path/to/your/file.txt"
backup_directory="/path/to/backup/directory"
backup_file "$file_to_backup" "$backup_directory"
Differenze principali tra lo script Python e lo script Bash:
if [ ! -d "$backup_dir" ]; then
invece di if not
os.path.exists(backup_dir):
.datetime.datetime.now()
per ottenere l'ora corrente. In Bash, si
utilizza $(date)
per lo stesso scopo.os.path.join
e os.path.basename
per manipolare i percorsi dei
file. In Bash, si utilizza una combinazione di concatenazione di
stringhe e $(basename "$file_path")
per ottenere lo stesso
risultato.print()
per stampare
messaggi. In Bash, si utilizza echo
.os.system()
per eseguire comandi del sistema. In Bash, si utilizza
direttamente il comando, come cp
.Queste differenze riflettono le differenze fondamentali tra i due linguaggi: Python è un linguaggio di programmazione ad alto livello che supporta la programmazione orientata agli oggetti e offre molte librerie per la manipolazione di file, date e altre operazioni comuni, mentre Bash è un linguaggio di scripting più semplice, utilizzato principalmente per la gestione dei file e l'esecuzione di comandi del sistema in un ambiente Unix/Linux.
Io: Produci una versione di backup.py
che utilizzi gli argomenti
da linea di comando.
llm:
import os
import datetime
import sys
def backup_file(file_path, backup_dir):
"""
Esegue il backup di un file specificato e lo salva in una directory di backup.
Parametri:
file_path (str): Percorso del file da eseguire il backup.
backup_dir (str): Percorso della directory dove salvare il backup.
"""
# Controlla se la directory di backup esiste
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
# Costruisce il percorso del file di backup
backup_file_path = os.path.join(backup_dir, os.path.basename(file_path))
# Esegue il backup del file
os.system(f"cp {file_path} {backup_file_path}")
# Stampa informazioni sul backup
print(f"Backup eseguito il {datetime.datetime.now()} per il file {file_path}")
print(f"File di backup salvato in: {backup_file_path}")
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Uso: python script_name.py <percorso_file> <percorso_backup>")
sys.exit(1)
file_to_backup = sys.argv[1]
backup_directory = sys.argv[2]
backup_file(file_to_backup, backup_directory)