【问题标题】:Close console while process is running进程运行时关闭控制台
【发布时间】:2017-09-12 11:17:46
【问题描述】:

我正在编写一个小型应用程序,它使用“索引文件”只需按几下按钮即可在资源管理器中打开文件夹。无论如何,每次应用程序关闭时,我都想在“后台进程”中更新该索引文件。更新索引文件意味着扫描我们的网络,对于一些远程用户来说可能需要几分钟。这就是为什么我希望它在扫描过程中隐藏控制台,以避免该过程被用户中止。

我尝试了几种类似的方法:

#these are just dummy lines
path = get_user_input()
subprocess.Popen(r'explorer "%s"' % path)
#Here I start my update process
multiprocessing.Process(target=update_index).start()
#end of script, now I want that process to continue until finished while main console closes. I only seem to get one or the other.

我也尝试过使用:

DETACHED_PROCESS = 0x00000008
CREATE_NO_WINDOW = 0x08000000
subprocess.Popen(command, shell=True, stdin=None, stdout=None, 
                 stderr=None, 
                 creationflags=DETACHED_PROCESS|CREATE_NO_WINDOW)

并设法获得一个单独的控制台窗口,但仍然无法阻止用户关闭该进程。

另外请记住,我想稍后将这个脚本与 py2exe 之类的东西一起分发,以便那些没有 python 的人可以访问它,所以我想使用 pythonw.exe 是不可能的。还是?

【问题讨论】:

  • 脚本一般应该有控制台吗?如果没有,请使用与 pythonw.exe 一起运行的 .pyw 文件。
  • 顺便说一句,如果您还使用DETACHED_PROCESSCREATE_NO_WINDOW 将被忽略,因为将它们组合起来毫无意义。 DETACHED_PROCESS 仅在不产生子控制台进程的情况下运行没有控制台的控制台应用程序才有意义,因为它们只会创建自己的控制台窗口。使用此标志,您还应该将标准句柄重定向到NUL 设备。 CREATE_NO_WINDOW 适用于子进程,因为它们将继承无窗口控制台。同样,您可以使用STARTUPINFO 隐藏控制台窗口。
  • 是的,脚本通常应该有一个控制台,因为在第一部分中,我提示用户回答两个问题。至少现在是这样完成的,有可能在控制台以外的其他窗口中提示这些问题,我会在我回到办公室时尝试。关于 subprocess 方法的标志,我不太清楚它们是如何工作的,我只是用谷歌搜索找到了这些并尝试了不同的组合,感谢您让我了解更多细节!

标签: python subprocess multiprocessing windows-console


【解决方案1】:

这并不是您真正要寻找的答案,但您可以重新设计您的系统架构:将您的索引更新程序编写为通过套接字与您的实际应用程序通信的服务器进程。然后,您只需让索引更新程序服务器进程连续运行(甚至可能在另一台机器上)并让索引更新程序进程完成所有耗时的工作。

【讨论】:

  • 就像你说的不完全是我要找的。当然这可能是一个解决方案,但我不想对这个脚本做这么大的事情。建立这样的服务意味着更多的工作,并涉及公司中能够提供此类服务的其他人。与仅将索引文件存储在网络上并在使用时进行更新相比。
【解决方案2】:

如果您只想执行以特定间隔发生的后台任务,请使用cron。如果您想在后台运行命令并在退出控制台后仍保持运行,请使用nohup

【讨论】:

  • 这个问题是为 Windows 标记的,并且 OP 的代码是为 Windows 设计的(例如,运行“explorer”并使用creationflags)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多