Python执行文件后删除它

1 投票
1 回答
794 浏览
提问于 2025-04-17 12:21

大家好,Stackoverflow的专家们,这个问题对Python程序员来说有点棘手。

我正在用Python开发一个加密的SQLITE3容器,最终的目标是普通用户,而不是开发者。

所有功能都正常运行,但我遇到的问题是如何从容器中执行文件的一个功能。

执行文件的步骤是这样的:

  1. 我用tempfile.mkdtemp创建一个临时文件夹。
  2. 我把容器中的文件解密到这个文件夹里(据我所知,这是打开文件的唯一方法)。
  3. A:在Windows上,我用os.system('file_name & exit')来执行文件,这样文件就会用默认应用打开(比如:图片用传真查看器打开,音乐用媒体播放器打开,等等)。这个过程通常是阻塞的。
  4. B:在Ubuntu/Mint上(这是我目前测试的系统),我用subprocess.check_output(['xdg-open', file_name])来执行,但这个过程并不总是阻塞的(比如:如果Gedit已经打开,再打开一个文本文件时,函数会立即返回)。
  5. 我删除文件。
  6. 我删除临时文件夹,因为它不会自动删除。

好的,步骤1和2是没问题的。我希望不要把文件写到硬盘上,比如我想从内存中执行它,但你需要告诉每个应用程序文件从哪里打开,必须是硬盘上的路径,对吧?

最安全的做法是为文本、图片、音乐和视频实现我自己的内部查看器,这样就不需要把数据导出到硬盘上。但这不太现实 :)

所以问题出在步骤4和5。我怎么知道在执行后什么时候删除文件,如果执行不是阻塞的呢?...

我尝试了subprocess中的所有函数(wait、communicate、check_call)和os.system,想让执行变成阻塞的...也许还有其他函数可以等待进程完成?...

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

也许有办法检查文件是否被某个应用程序打开?比如:“my-pic.jpg”被图像查看器打开,所以我还不能删除它,但我可以在几秒钟后再检查一下,如果没有其他应用在使用它,我就可以删除它。// 也许用“ps ax | grep my-pic”可以找到文件是否打开。但这在Windows上不适用。

有什么想法或者建议吗?

非常感谢!

1 个回答

1

一些想法:

  • 让用户告诉你的应用程序,当他不再需要临时提取的文件时。
  • 查询Windows的API,找出哪些进程正在使用某个文件夹中的文件(比如你的临时文件夹)。
  • 无论如何,尽量在打开文件后尽快删除它;这通常是可行的,因为很多应用程序并不会保护它们正在使用的文件,也就是说,它们允许其他应用程序在使用时修改或删除这些文件。
  • 看看PendMoves/MoveFile。也许你可以为你的应用程序实现类似的功能。
  • 为你的应用程序创建一个小的内存盘,用来存储临时文件。
  • 使用TrueCrypt或类似工具来挂载加密容器(由你的应用程序管理),将临时文件存储在里面,并在必要时强制卸载这些容器。

撰写回答