Domanda

Ho creato uno script Python che simula un sistema operativo. Ha un prompt dei comandi e un file system virtuale. Sto usando il modulo shelve per simulare il file system, essendo multi-dimensionale al fine di sostenere una gerarchia di directory. Tuttavia, sto avendo dei problemi l'implementazione di un comando 'cd'. Non so come ottenere dentro e fuori di directory, anche se ho un piccolo insieme di directory create quando si avvia il programma di prima. Ecco il mio codice:

import shelve

fs = shelve.open('filesystem.fs')
directory = 'root'
raw_dir = None
est_dir = None

def install(fs):
    fs['System'] = {}
    fs['Users'] = {}
    username = raw_input('What do you want your username to be? ')
    fs['Users'][username] = {}

try:
    test = fs['runbefore']
    del test
except:
    fs['runbefore'] = None
    install(fs)

def ls(args):
    print 'Contents of directory', directory + ':'
    if raw_dir:
        for i in fs[raw_dir[0]][raw_dir[1]][raw_dir[2]][raw_dir[3]]:
            print i
    else:
        for i in fs:
            print i

def cd(args):
    if len(args.split()) > 1:
        if args.split()[1] == '..':
            if raw_dir[3]:
                raw_dir[3] = 0
            elif raw_dir[2]:
                raw_dir[2] = 0
            elif raw_dir[1]:
                raw_dir[1] = 0
            else:
                print "cd : cannot go above root"

COMMANDS = {'ls' : ls}

while True:
    raw = raw_input('> ')
    cmd = raw.split()[0]
    if cmd in COMMANDS:
        COMMANDS[cmd](raw)

#Use break instead of exit, so you will get to this point.
raw_input('Press the Enter key to shutdown...')

Non ricevo un errore, ho appena ho idea di come farlo e nessuna idea di cosa cercare oltre 'il file system ripiano python', e che non ottiene nulla di utile.

È stato utile?

Soluzione

I fornire il codice per aiutare a seguito, ma prima, un consiglio generale che dovrebbe aiutare con il vostro disegno:

  • Il motivo hai difficoltà con le directory che cambiano è che si rappresenta la variabile directory corrente nel modo sbagliato. La directory corrente dovrebbe essere qualcosa di simile a una lista, dalla directory di livello superiore per quello corrente. Una volta che avete, basta fare una scelta su come archiviare i file utilizzando ripiano in base alla loro directory (considerando che tutte le chiavi in ??Ripiano devono essere stringhe).

  • Sembra che si stavano progettando a rappresentare il filesystem come una serie di nidificato dictionaries- una scelta buona. Ma nota che se si modificano oggetti mutabili in shelve, si deve a) insieme riprese di valore su True e b) chiamata fs.sync () per impostare loro.

  • Si dovrebbe essere strutturare l'intero file system in una classe piuttosto che in una serie di funzioni. Essa vi aiuterà a mantenere i vostri dati condivisi organizzata. Il codice qui sotto non ne consegue che, ma è la pena di pensare.

Così, ho sistemato cd e anche scritto un comando rudimentale mkdir per voi. La cosa fondamentale per renderli lavoro è quello di, come ho detto sopra, hanno current_dir essere una lista che mostra il vostro percorso attuale, e anche di avere un modo semplice (la funzione current_dictionary) per ottenere da tale elenco alla directory di file system appropriata.

Con questo, ecco il codice per iniziare:

import shelve

fs = shelve.open('filesystem.fs', writeback=True)
current_dir = []

def install(fs):
    # create root and others
    username = raw_input('What do you want your username to be? ')

    fs[""] = {"System": {}, "Users": {username: {}}}

def current_dictionary():
    """Return a dictionary representing the files in the current directory"""
    d = fs[""]
    for key in current_dir:
        d = d[key]
    return d

def ls(args):
    print 'Contents of directory', "/" + "/".join(current_dir) + ':'
    for i in current_dictionary():
        print i

def cd(args):
    if len(args) != 1:
        print "Usage: cd <directory>"
        return

    if args[0] == "..":
        if len(current_dir) == 0:
            print "Cannot go above root"
        else:
            current_dir.pop()
    elif args[0] not in current_dictionary():
        print "Directory " + args[0] + " not found"
    else:
        current_dir.append(args[0])


def mkdir(args):
    if len(args) != 1:
        print "Usage: mkdir <directory>"
        return
    # create an empty directory there and sync back to shelve dictionary!
    d = current_dictionary()[args[0]] = {}
    fs.sync()

COMMANDS = {'ls' : ls, 'cd': cd, 'mkdir': mkdir}

install(fs)

while True:
    raw = raw_input('> ')
    cmd = raw.split()[0]
    if cmd in COMMANDS:
        COMMANDS[cmd](raw.split()[1:])

#Use break instead of exit, so you will get to this point.
raw_input('Press the Enter key to shutdown...')

Ed ecco una dimostrazione:

What do you want your username to be? David
> ls
Contents of directory /:
System
Users
> cd Users
> ls
Contents of directory /Users:
David
> cd David
> ls
Contents of directory /Users/David:
> cd ..
> ls
Contents of directory /Users:
David
> cd ..
> mkdir Other
> ls
Contents of directory /:
System
Users
Other
> cd Other
> ls
Contents of directory /Other:
> mkdir WithinOther
> ls
Contents of directory /Other:
WithinOther

E 'importante notare che questo è finora solo un giocattolo: c'è ancora un sacco resta da fare . Ecco alcuni esempi:

  • In questo momento c'è solo una cosa come Directories, i file non regolari.

  • mkdir non verifica se una directory esiste già, sarebbe sovrascrivere uno con una directory vuota.

  • Non puoi ls con una directory specifica come argomento, (come ls Users), solo la directory corrente.

Comunque, questo dovrebbe mostrare un esempio di un progetto per tenere traccia del proprio directory corrente. Buona fortuna!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top