2010-12-04 34 views
29

Quiero crear un ramdisk en Python. Quiero poder hacer esto de forma multiplataforma, por lo que funcionará en Windows XP-to-7, Mac y Linux. Quiero poder leer/escribir en el ramdisk como si fuera una unidad normal, preferiblemente con una letra/ruta de unidad.¿Cómo puedo crear un ramdisk en Python?

La razón por la que quiero esto es escribir pruebas para un script que crea un directorio con una cierta estructura. Quiero crear el directorio completamente en el disco RAM, así me aseguraré de que se borre por completo una vez que terminen las pruebas. Consideré usar Python's tempfile, pero si la prueba se detendrá en el medio, es posible que el directorio no se elimine. Quiero estar completamente seguro de que se borrará incluso si alguien desconecta la computadora en el medio de una prueba.

+7

Prefiero sospechar que no existe una forma sencilla y multiplataforma para hacer esto, ya que cada sistema operativo maneja el montaje de manera diferente. ¡Pregunta muy interesante, sin embargo! –

+0

"si la prueba se detendrá en el medio, el directorio podría no eliminarse" ¿Tiene alguna evidencia de esto? Eso contradice la documentación. –

+1

@ S.Lott Imagino si la prueba no (tiene la oportunidad de) limpiarse por sí misma. En ese caso, argumentaría: ¿por qué no simplemente hacer que la configuración de la prueba garantice un estado limpio (eliminar el directorio si es necesario, tal vez), independientemente del estado existente? –

Respuesta

13

¿Qué tal PyFilesystem?

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

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

La desventaja es que usted tiene para acceder al sistema de archivos con la API PyFilesystem, pero también se puede acceder a los fs reales con PyFilesystem.

+2

Actualmente parece ser la mejor solución, pero * necesitaré * sustitutos para 'os.mkdir' (y otras funciones similares) que operan en' MemoryFS'. Si no existen tales funciones, tendré que escribir las mías. –

+0

En realidad, parece que puede montar MemoryFS con fusible en sistemas Linux y acceder a eso con funciones de stock de Python. http://www.willmcgugan.com/2010/6/20/pyfilesystem-03-released/ http://packages.python.org/fs/expose/fuse.html#module-fs.expose.fuse – Epeli

+0

El fusible La cosa es realmente increíble, pero el hecho de que no sea multiplataforma es un problema. Además, parte de ella tiene licencia GPL, lo que puede ser un problema. –

4

Dado que el manejo de archivos y directorios es de tan bajo nivel y depende del sistema operativo, dudo que exista (o que sea posible) algo como lo que quiere. Su mejor opción podría ser implementar un conjunto de funciones, clases y métodos "virtuales" similares a los del sistema de archivos, que haga un seguimiento de los archivos y la jerarquía de directorios creados y su contenido.

Callables en una emulación de este tipo deberían tener la misma firma y devolver el mismo valor (es) que sus contrapartes en los diversos módulos integrados de Python y módulos que utiliza su aplicación.

Sospecho que esto podría no ser tanto trabajo como suena, emulando la interfaz de sistema de archivos estándar de Python, dependiendo de la cantidad que estés usando, ya que no tendrías que imitar necesariamente todos eso. Además, si está escrito en Pure Python ™, también sería portátil y fácil de mantener y mejorar.

+2

hay módulos de Python como [fs] (http://pypi.python.org/pypi/fs/0.3.0) que hacen casi esto, pero debido a que es difícil de envolver, proporcionan su propia interfaz que no coincide pero tiene todas las operaciones como métodos en un objeto –

+0

Tiene razón, leí mal su sugerencia. Borré mi comentario anterior ahora para evitar dirigir mal a otras personas. –

1

Una opción podría ser la de inyectar (parche mono) versiones modificadas de los métodos utilizados en el módulo os, así como las órdenes internas open y file que escriben en StringIO archivos en lugar de en el disco. Obviamente, esta sustitución solo debería ocurrir para el módulo que se está probando;

+0

Para mi caso no será de ayuda, ya que mi script crea directorios. –

+0

Puede envolver 'os.mkdir' de manera similar. – SingleNegationElimination

+0

Interesante ... ¿Y cómo "virtualizaré" 'os.mkdir'? –

-6

Por favor, lea esto:

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

"devolver un objeto de tipo fichero que puede ser utilizado como un área de almacenamiento temporal El archivo se ha creado usando mkstemp() Se hará.. se destruirá tan pronto como sea cerrado (incluido un cierre implícito cuando el objeto es basura recogido). "

Todo se maneja para usted. No hacer nada y ya funciona.

+1

Como dije en la pregunta, necesito crear directorios, no solo archivos. Desde su enlace: "El usuario de' mkdtemp() 'es responsable de eliminar el directorio temporal y su contenido cuando termine con él." –

Cuestiones relacionadas