2010-12-04 11 views
29

Ich möchte eine Ramdisk in Python erstellen. Ich möchte dies in einer plattformübergreifenden Weise tun können, so dass es unter Windows XP-7, Mac und Linux funktioniert. Ich möchte auf der Ramdisk lesen/schreiben können, als wäre es ein normales Laufwerk, vorzugsweise mit einem Laufwerksbuchstaben/-pfad.Wie kann ich eine Ramdisk in Python erstellen?

Der Grund, warum ich dies möchte, ist Tests für ein Skript schreiben, das ein Verzeichnis mit einer bestimmten Struktur erstellt. Ich möchte das Verzeichnis komplett in der Ramdisk erstellen, damit ich sicher sein kann, dass es nach den Tests komplett gelöscht wird. Ich erwog Pythons tempfile, aber wenn der Test in der Mitte gestoppt wird, wird das Verzeichnis möglicherweise nicht gelöscht. Ich möchte ganz sicher sein, dass es gelöscht wird, selbst wenn jemand mitten in einem Test den Stecker am Computer zieht.

+7

Ich vermute eher, dass es keine einfache, plattformübergreifende Möglichkeit gibt, dies zu tun, da jedes Betriebssystem die Montage anders durchführt. Sehr interessante Frage, obwohl! –

+0

"Wenn der Test in der Mitte gestoppt wird, wird das Verzeichnis möglicherweise nicht gelöscht" Haben Sie Beweise dafür? Das widerspricht der Dokumentation. –

+1

@ S.Lott Ich stelle mir vor, ob der Test nicht nach sich selbst aufräumt (bekomme eine Chance). In diesem Fall würde ich argumentieren: Warum sollte das Test-Setup nicht einfach einen sauberen Zustand sicherstellen (wenn nötig, Verzeichnis löschen, wenn es erforderlich ist), ungeachtet des bestehenden Zustands? –

Antwort

13

Wie wäre es mit PyFilesystem?

http://docs.pyfilesystem.org/en/latest/memoryfs.html#module-fs.memoryfs

http://docs.pyfilesystem.org/en/latest/tempfs.html#module-fs.tempfs

Der Nachteil ist, dass Sie das Dateisystem mit PyFilesystem API zugreifen, aber Sie können auch die realen fs mit PyFilesystem zuzugreifen.

+2

Dies scheint derzeit die beste Lösung zu sein, aber ich * werde Ersatz für 'os.mkdir' (und andere solche Funktionen) benötigen, die auf' MemoryFS' operieren. Wenn keine solchen Funktionen existieren, muss ich meine eigenen schreiben. –

+0

Eigentlich scheint es, dass Sie das MemoryFS mit Sicherung auf Linux-Systemen mounten können und auf diese mit den Bestandsfunktionen von Python zugreifen können. http://www.willmcgugan.com/2010/6/20/pyfilesystem-03-released/ http://packages.python.org/fs/expose/fuse.html#module-fs.expose.fuse – Epeli

+0

Die Sicherung Ding ist wirklich fantastisch, aber die Tatsache, dass es nicht plattformübergreifend ist, ist ein Problem. Außerdem ist ein Teil davon GPL-lizenziert, was ein Problem sein kann. –

4

Da die Datei- und Verzeichnisverwaltung so niedrig und vom Betriebssystem abhängig ist, bezweifle ich, dass irgendetwas, was Sie wollen, existiert (oder sogar möglich ist). Am besten können Sie eine "virtuelle" dateisystemähnliche Gruppe von Funktionen, Klassen und Methoden implementieren, die die erstellten Dateien und die erstellte Verzeichnishierarchie sowie deren Inhalt verfolgen.

Callables in einer solchen Emulation müssen die gleiche Signatur haben und die gleichen Werte zurückgeben wie ihre Pendants in den verschiedenen Python-Standard-Einbauten und -Modulen, die Ihre Anwendung verwendet.

Ich vermute, das könnte nicht so viel Arbeit sein, wie es klingt - emulieren die Standard-Python-Dateisystem-Schnittstelle - je nachdem, wie viel davon Sie tatsächlich verwenden, da Sie nicht unbedingt alle imitieren müssten es. Wenn es in Pure Python ™ geschrieben wird, wäre es auch tragbar und einfach zu warten und zu verbessern.

+2

Es gibt Python-Module wie [fs] (http://pypi.python.org/pypi/fs/0.3.0), die fast das tun, aber weil es schwer zu wickeln ist, stellen sie ihre eigene Schnittstelle zur Verfügung, die nicht zusammenpasst aber hat alle Operationen als Methoden für ein Objekt –

+0

Sie haben Recht, ich habe Ihren Vorschlag falsch gelesen. Ich habe meinen vorherigen Kommentar gelöscht, um zu verhindern, dass andere Personen fehlgeleitet werden. –

1

Eine Option könnte sein, zu injizieren (Affe Patch) modifizierte Versionen der verwendeten Methoden im os Modul sowie die builtins open und file, die StringIO Dateien statt auf die Festplatte schreiben. Offensichtlich sollte diese Ersetzung nur für das getestete Modul stattfinden.

+0

Für meinen Fall wird es nicht helfen, da mein Skript Verzeichnisse erstellt. –

+0

Sie können os.mkdir auf ähnliche Weise einpacken. – SingleNegationElimination

+0

Interessant ... Und wie würde ich "os.mkdir" virtualisieren? –

-6

Bitte lesen Sie diese:

http://docs.python.org/library/tempfile.html#tempfile.TemporaryFile

„Return eine dateiähnliche Objekt, das als temporärer Speicherbereich verwendet werden kann, die Datei erstellt wird mkstemp() Es wird.. zerstört werden, sobald es geschlossen ist (einschließlich eine implizite schließen , wenn das Objekt Müll gesammelt wird). "

Es ist alles für Sie erledigt. Tue nichts und es funktioniert schon.

+1

Wie ich in der Frage gesagt habe, muss ich Verzeichnisse erstellen, nicht nur Dateien. Von Ihrem Link: "Der Benutzer von' mkdtemp() 'ist dafür verantwortlich, das temporäre Verzeichnis und seinen Inhalt zu löschen, wenn sie damit fertig sind." –