Python执行一个文件,然后删除它

Python执行一个文件,然后删除它,python,Python,嗨,Stackoverflow专家,对于Python程序员来说,这是一个困难的问题 我正在开发一个用Python编写的加密SQLITE3容器。最终的目标是用户,而不是开发人员 所有函数都按预期工作,但我的问题是函数执行容器中的文件 EXECUTE如何工作: 我使用tempfile.mkdtemp创建了一个临时文件夹 我将文件从容器解密到该文件夹中(据我所知,这是打开文件的唯一方法) 答:在Windows上,我使用os.system(“文件名&退出”)执行文件,因此该文件使用默认应用程序打开(例如

嗨,Stackoverflow专家,对于Python程序员来说,这是一个困难的问题

我正在开发一个用Python编写的加密SQLITE3容器。最终的目标是用户,而不是开发人员

所有函数都按预期工作,但我的问题是函数执行容器中的文件

EXECUTE如何工作:

  • 我使用tempfile.mkdtemp创建了一个临时文件夹
  • 我将文件从容器解密到该文件夹中(据我所知,这是打开文件的唯一方法)
  • 答:在Windows上,我使用os.system(“文件名&退出”)执行文件,因此该文件使用默认应用程序打开(例如:默认情况下使用传真查看器打开图像,默认情况下使用媒体播放器打开音乐,等等)。这通常是阻塞
  • B:在Ubuntu/Mint上(这是我目前为止测试的全部),我使用子进程执行。检查输出(['xdg-open',file_name]),但这并不总是阻塞(例如:当默认情况下使用Gedit打开一个文本文件时,如果Gedit已经打开,函数会立即返回)
  • 我删除了这个文件
  • 我删除临时文件夹,因为它不会自动删除
  • 好的,那么第1步和第2步就可以了。我不想把文件写在硬盘上,例如我想从内存中执行,但你需要告诉每个应用程序从哪里打开文件,它必须是硬盘的路径,对吗

    最安全的方法是实现我自己的文本、图像、音乐、视频内部查看器,因此我不需要将数据导出到HDD上。但这并不现实:)

    所以问题是第4步和第5步。如果执行未被阻止,如何知道执行后何时删除文件

    我尝试了子进程(wait、communicate、check_call)和os.system中的所有函数,以使执行阻塞。。。也许还有其他函数需要等待进程完成

    也许有办法自动删除临时文件?或者我应该在运行时列出一个列表,并在程序关闭时删除它们

    也许有一种方法可以检查某个应用程序是否打开了某个文件?例如:“my pic.jpg”是由图像查看器打开的,所以我还不能删除它,但我会在几秒钟后再次检查,如果没有其他应用程序使用它,我可以删除它。//也许通过“ps ax | grep my pic”,我可以找到文件是否已打开。但这在Windows上不起作用

    有什么想法,有什么建议吗

    多谢各位

    一些想法:

    • 当用户不再需要临时提取的文件时,让用户告诉您的应用程序
    • 查询Windows API以查找(例如,您的临时文件夹)
    • 在任何情况下,尝试在打开文件后不久删除该文件;这通常是可行的,因为许多应用程序不保护它们正在使用的文件,即它们允许其他应用程序在使用文件时修改/删除文件
    • 看一看。也许您可以为您的应用程序实现类似的功能
    • 为应用程序创建一个小型RamDisk,并使用它将临时文件存储在内存中
    • 使用TrueCrypt或类似工具装载加密容器(由您的应用程序管理),将临时文件存储在其中,并在必要时强制卸载这些容器
      • 一些想法:

        • 当用户不再需要临时提取的文件时,让用户告诉您的应用程序
        • 查询Windows API以查找(例如,您的临时文件夹)
        • 在任何情况下,尝试在打开文件后不久删除该文件;这通常是可行的,因为许多应用程序不保护它们正在使用的文件,即它们允许其他应用程序在使用文件时修改/删除文件
        • 看一看。也许您可以为您的应用程序实现类似的功能
        • 为应用程序创建一个小型RamDisk,并使用它将临时文件存储在内存中
        • 使用TrueCrypt或类似工具装载加密容器(由您的应用程序管理),将临时文件存储在其中,并在必要时强制卸载这些容器

        如果进程是非阻塞的,我认为无法知道它何时关闭文件。此外,请记住,任何编辑器都可以在不通知您的情况下将文件的副本自动保存到其他位置。即使删除数据,数据仍会保留在硬盘上,直到被覆盖。“你想防范什么样的攻击?”ThomasK感谢你的评论。我知道Gedit会在编辑时保存备份副本,大多数图像查看器会保存缩略图并缓存图像等。因此,如果从外部打开文件,则始终存在暴露存储在容器中的私有数据的巨大风险。这就是为什么我之前说过我更喜欢在内部打开它们。无论如何,我试图防止从容器访问数据。每个文件的元数据都未加密,因此任何人都可以知道它是什么类型的数据,但除非它知道密码,否则无法对其进行解密。您试图阻止谁访问该数据?另一个有权访问数据库的用户?另一个用户同时登录到同一台计算机?之后登录的其他用户?另一个稍后对驱动器具有完全物理访问权限的用户?同一个用户应该已经完成了吗?计算机上可能正在运行的潜在恶意软件?您是控制打开文件的计算机还是用户?@ThomasK:只有少数人知道从容器中解密文件的密码;通常,一个人放一些文件,只有那个人一次又一次地使用容器。它不是一次性使用的。你可以在DropBox上上传一个容器,或者让它作为私有容器使用,等等。我希望这能回答这个问题,但我不明白这有什么关系。如果这个过程是非阻塞的,我想没有办法知道它什么时候关闭文件。此外,请记住,任何编辑器都可以自动保存fil的副本