当前位置: 首页 > 面试题库 >

如何创建一个可由子进程读取的临时文件?

岑明辉
2023-03-14
问题内容

我正在编写一个Python脚本,该脚本需要将一些数据写入临时文件,然后创建一个运行C
++程序的子进程,该程序将读取该临时文件。我正在尝试使用NamedTemporaryFile此功能,但是根据文档,

在命名的临时文件仍处于打开状态时,是否可以使用该名称第二次打开文件,会因平台而异(可以在Unix上使用;在Windows NT或更高版本上不能使用)。

实际上,在Windows上,如果我在写入后刷新了临时文件,但是在我希望它消失之前不要关闭它,则子进程将无法打开它进行读取。

我正在通过以下方法来解决此问题:使用创建文件delete=False,在生成子进程之前将其关闭,然后在完成后手动将其删除:

fileTemp = tempfile.NamedTemporaryFile(delete = False)
try:
    fileTemp.write(someStuff)
    fileTemp.close()
    # ...run the subprocess and wait for it to complete...
finally:
    os.remove(fileTemp.name)

这似乎不雅。有一个更好的方法吗?也许是一种打开临时文件权限的方法,以便子进程可以使用它?


问题答案:

至少如果您使用现有的Python库打开一个临时文件,则在Windows中无法从多个进程访问该文件。根据MSDN,您可以指定第三个参数(dwSharedMode)共享模式标志FILE_SHARE_READ以使其CreateFile()起作用:

在文件或设备上启用后续打开操作,以请求读取访问权限。否则,其他进程如果请求读取访问权限,则无法打开文件或设备。如果未指定此标志,但是已打开文件或设备以进行读取访问,则该功能将失败。

因此,您可以编写Windows特定的C例程来创建自定义的临时文件打开器功能,然后从Python调用它,然后可以使子进程访问文件而不会出现任何错误。但是我认为您应该坚持使用现有方法,因为它是最可移植的版本,可以在任何html" target="_blank">系统上使用,因此是最优雅的实现。

  • 关于Linux和Windows文件锁定的讨论可以在这里找到。

编辑:原来也可以从Windows中的多个进程打开和读取临时文件。请参阅PiotrDobrogost的答案

(…)NamedTemporaryFile在Windows上尝试重新打开失败的唯一原因是,当我们重新打开时,我们需要使用O_TEMPORARY。

他举例说明了如何在Python 3.3+中执行此操作

import os, tempfile

DATA = b"hello bob"

def temp_opener(name, flag, mode=0o777):
    return os.open(name, flag | os.O_TEMPORARY, mode)

with tempfile.NamedTemporaryFile() as f:
    f.write(DATA)
    f.flush()
    with open(f.name, "rb", opener=temp_opener) as f:
        assert f.read() == DATA

assert not os.path.exists(f.name)

因为Python 2.xopener的内置函数中没有参数,所以open()我们必须结合使用较低的级别os.open()和os.fdopen()函数才能达到相同的效果:

import subprocess
import tempfile

DATA = b"hello bob"

with tempfile.NamedTemporaryFile() as f:
    f.write(DATA)
    f.flush()

    subprocess_code = \
    """import os
       f = os.fdopen(os.open(r'{FILENAME}', os.O_RDWR | os.O_BINARY | os.O_TEMPORARY), 'rb')
       assert f.read() == b'{DATA}'
    """.replace('\n', ';').format(FILENAME=f.name, DATA=DATA)

    subprocess.check_output(['python', '-c', subprocess_code]) == DATA


 类似资料:
  • 问题内容: 无论如何,我可以写到tempfile并将其包含在命令中,然后关闭/删除它。我想执行命令,例如:some_command / tmp / some-temp-file。 提前谢谢了。 问题答案: 如果需要带有名称的临时文件,则必须使用该功能。然后就可以使用了。有关详细信息,请阅读 http://docs.python.org/library/tempfile.html。

  • 问题内容: 是否存在在Java应用程序中创建临时目录的标准可靠方法?Java的问题数据库中有一个条目,注释中包含一些代码,但是我想知道在一个常用的库(Apache Commons等)中是否可以找到一种标准的解决方案? 问题答案: 如果你使用的是JDK 7,请使用新的Files.createTempDirectory类创建临时目录。 在JDK 7之前,应该这样做: 如果需要,可以提出更好的异常(IO

  • 我有一个jobIntentService创建一个文件以便在其中添加一些文本,但我得到错误。我不知道我做错了什么...下面是我的代码: 谢谢你的帮助!

  • 问题内容: 我在Linux机器上运行一个python脚本,该脚本使用subprocess.check_output()创建一个子进程,如下所示: 问题是,即使父进程死亡,子进程仍在运行。父母去世后,我还有什么办法可以杀死子进程? 问题答案: 您的问题是使用-是正确的,您无法使用该接口获取子PID。改用Popen: 为确保您在出口处杀死孩子:

  • 问题内容: 我目前正在为一家餐馆开发门户应用程序。使用的后端数据库是Mysql,而我正在使用Spring JDBC支持来编写数据访问逻辑。 我的某些DAO充满了多个查询,并且正获得多达数千行的代码。我认为我可以通过将一些逻辑移到SQL- PSM过程中来减少大小和复杂性(因为Java中的数据绑定和粘合代码是令人讨厌的事情)。 但是,我对Db没有DDL权限,因此无法创建该过程。 我想知道是否有一种方法

  • 我上过Java的基础课,但我的知识很少。自从我越来越熟悉Java以来,我在过去一两个月里创建了一个基于文本的rpg。我想知道是否有任何方法可以让程序创建一个“保存”文件存储在某个文件夹中,并提示用户是否想要打开保存的字符。我还没有学习Java的任何面向对象的部分。我能做些什么来实现这一点?