Question

J'ai mis en place un script Python qui simule un système d'exploitation. Il dispose d'une invite de commande et un système de fichiers virtuel. J'utilise le module shelve pour simuler le système de fichiers, étant multidimensionnel afin de soutenir une hiérarchie des répertoires. Cependant, je ne parviens pas à mettre en œuvre une commande « cd ». Je ne sais pas comment entrer et sortir des répertoires, même si j'ai un petit ensemble de répertoires créés lors du premier lancement du programme. Voici mon code:

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...')

Je ne reçois pas une erreur, je n'ai aucune idée comment le faire et aucune idée de ce qu'il faut rechercher en plus « python système de fichiers shelve », et qui ne soit pas quelque chose d'utile.

Était-ce utile?

La solution

Je donne un code pour vous aider ci-dessous, mais d'abord, certains conseils généraux qui devraient vous aider avec votre conception:

  • La raison pour laquelle vous éprouvez des difficultés avec des répertoires est l'évolution que vous représentez la variable de répertoire courant dans le mauvais sens. Votre répertoire courant devrait être quelque chose comme une liste, à partir de votre répertoire de niveau supérieur à votre actuel. Une fois que vous avez, vous faire juste un choix sur la façon dont stocker des fichiers en utilisant shelve en fonction de leur répertoire (considérant que toutes les clés Shelve doivent être des chaînes).

  • Il semble que vous aviez prévu de représenter le système de fichiers comme une série de imbriqué Dictionaries- un bon choix. Mais notez que si vous changez des objets mutables dans shelve, vous devez a) ensemble writeback True et b) appel fs.sync () pour les définir.

  • Vous devriez structurer votre système de fichiers entier dans une classe plutôt que dans une série de fonctions. Il vous aidera à garder vos données partagées organisées. Le ci-dessous le code ne suit pas, mais il est de penser vaut environ.

Alors, je fixe jusqu'à cd et également écrit une commande mkdir rudimentaire pour vous. La chose essentielle pour les faire travailler est, comme je l'ai dit plus haut, ont current_dir une liste qui montre votre chemin en cours, et aussi d'avoir un moyen facile (la fonction current_dictionary) pour obtenir de cette liste dans le répertoire système de fichiers approprié.

Avec cela, voici le code pour vous lancer:

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...')

Et voici une démonstration:

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

Il est important de noter que cela est si loin juste un jouet: il y a encore une tonne reste à faire . Voici quelques exemples:

  • En ce moment, il n'y a qu'une chose que directories- fichiers ne réguliers.

  • mkdir ne vérifie pas si un répertoire existe déjà, il écraserait un avec un répertoire vide.

  • Vous ne pouvez pas ls avec un répertoire spécifique comme argument, (comme ls Users), seul votre répertoire courant.

Pourtant, cela devrait vous montrer un exemple de conception pour garder une trace de votre répertoire en cours. Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top