Python:内存中的目录,用于subprocess.call()的当前工作目录

时间:2015-11-27 16:49:50

标签: python

我编写了一个python脚本,它读取METAFONT文件,在其上运行METAPOST(生成大约250个PostScript文件),在FontForge中导入这些PostScript文件并输出OpenType字体。以下是此脚本的简化版本:

import os,sys,fontforge,glob,subprocess,tempfile,shutil
if __name__ == "__main__":          
    mffile = os.path.abspath(sys.argv[1])
    tempdir = tempfile.mkdtemp()
    font = fontforge.font()
    subprocess.call(
    ['mpost',
    '&mfplain',
    '\mode=localfont;',
    'mag:=100.375;',
    'outputtemplate:="%c.eps";',
    'input %s;' % mffile,
    'bye'],
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE,
    cwd=tempdir)
    glyph_files = glob.glob(os.path.join(tempdir, "*.eps"))
    for eps in glyph_files:
        code = int(os.path.splitext(os.path.basename(eps))[0])
        glyph = font.createChar(code)
        glyph.importOutlines(eps, ("toobigwarn", "correctdir"))
    font.generate("font.otf")
    shutil.rmtree(tempdir)
    exit(0)

目前,250个PostScript文件存储在一个临时目录中。为了使事情更快,我希望它们存储在内存中。因此,tempdir应该是内存中的目录。我已经尝试过MemoryFS(类似这样的

from fs.memoryfs import MemoryFS
mem = MemoryFS() 
mem.makedir('temdpir')      

)但我无法弄清楚如何访问tempdir中的文件

glyph_files = glob.glob(os.path.join(tempdir, "*.eps"))

作品。

您对如何访问这些文件有什么建议吗?谢谢。 (也欢迎使用MemoryFS的替代方案。)

1 个答案:

答案 0 :(得分:1)

收到docsgetsyspath是获取操作系统支持的文件路径的方法。但是,MemoryFS不受真实文件系统的支持,并且不会覆盖fs.base.FS的默认实现,并且会引发NoSysPathError

内存支持的文件系统实现将取决于您的操作系统。例如,在现代的Linux中,您可以mount a tmpfs partition,它看起来像虚拟文件系统中的其他文件夹,但文件将存储在内存中。但请注意,如果系统内存不足,tmpfs的某些页面可能会移动到交换区域。