【问题标题】:.Popen a pdf then delete file once it is closed.Popen 一个 pdf 然后在文件关闭后删除文件
【发布时间】:2020-11-25 20:26:50
【问题描述】:

我需要 .Popen 一个 pdf,让我的用户查看、打印、做他们需要做的任何事情,然后一旦关闭,删除文件。目前我尝试的是这样的:

def open_file():
  try:
    subprocess.Popen(file_path, shell=True)
  except:
    print(exception)
  finally:
    if os.path.exists(file_path):
      os.remove(file_path)
      print("File successfully removed.")

我需要的是更像这样的东西:

def open_file():
  try:
    subprocess.Popen(file_path, shell=True)
  except:
    print(exception)
  finally:
    if os.path.exists(file_path):
      while file_path.IS_OPEN:
        sleep(1)
      if file_path.IS_NOT_OPEN:
        os.remove(file_path)
        print("File successfully removed.")

或类似的东西。我还是个新手,所以我确定我的语法是错误的。这可能吗?

我发现如果我在第一个示例的 os.remove 之前放置一个 sleep 函数,我会收到一个错误,说它无法删除打开的文件,否则它会在打开之前以某种方式删除,导致打开错误。我可以根据第一个错误进行某种循环,不断检查文件是否打开,如果没有,将其删除?

【问题讨论】:

  • 您可以将 pdf 复制到临时驱动器中,打开临时驱动器并删除源。在某些时候关闭会话/重新启动时临时文件将被删除
  • 好的,我正在使用一个临时文件,但我读到一些关于临时文件的内容说“开发人员应该自己清理”。这是我第一次尝试临时文件及其工作方式。
  • 您使用的是哪个操作系统?您可以执行Popen(file_path, shell=True).wait(),它将在子进程上等待......这可能不起作用,因为有时中间进程会启动 pdf 阅读器然后退出,从而阻止您的等待。
  • 我用的是Win10
  • 效果很好!

标签: python subprocess popen delete-file


【解决方案1】:

尽管您打开了 PDF 阅读器,但您不必等待它完成。您可以等到程序退出尝试删除。几个subprocess 函数可以做到这一点,但run 正在考虑现代方式。

subprocess.run(file_path, shell=True)

如果子进程实际上是 PDF 阅读器,则此方法有效。有时中间程序运行阅读器然后退出,破坏了这个解决方案。

【讨论】:

  • 你可以使用subprocess.call。不需要波本。通话也会阻塞
  • @Jean-FrançoisFabre - 好点。我想我会将其更改为 run,因为 call 被记录为“较旧的高级 API”。
  • run 立即给我这个错误:“该进程无法访问该文件,因为它正在被另一个进程使用”,wait() 是迄今为止唯一对我有用的东西跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
相关资源
最近更新 更多