进程正在运行时关闭控制台

问题描述:

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

我试过类似几件事情:

#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是没有问题的。要么?

+0

脚本通常应该有一个控制台吗?如果没有,请使用与pythonw.exe一起运行的.pyw文件。 – eryksun

+0

顺便说一句,如果您也使用'DETACHED_PROCESS',则忽略'CREATE_NO_WINDOW',因为将它们合并是没有意义的。 'DETACHED_PROCESS'对于在没有控制台的情况下运行控制台应用程序是有意义的,前提是它不会生成子控制台进程,因为它们只会创建自己的控制台窗口。有了这个标志,你还应该将标准句柄重定向到'NUL'设备。 'CREATE_NO_WINDOW'适用于子进程,因为它们将继承无窗口控制台。同样,您可以使用'STARTUPINFO'来隐藏控制台窗口。 – eryksun

+0

是的脚本通常应该有一个控制台,因为在第一部分用户我提出了两个问题来回答。至少这就是现在这样做的方式,有可能是在除了控制台之外的其他窗口中提出这些问题,当我回到办公室时我会尝试。关于子进程方法的标志,我没有太多的线索,他们是如何工作的我只是用google搜索到了那些并尝试了不同的组合,谢谢让我详细介绍一下这些细节! – Saftblandaren

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

+0

就像你说的不完全是我在找什么。当然,这可能是一个解决方案,但我不想做这么大的脚本。建立这样的服务意味着更多的工作,并让公司中的其他人能够主持这种服务。与仅使用时更新的网络上存储的索引文件相比。 – Saftblandaren

如果您只想执行以特定间隔发生的后台任务,请使用cron。如果要在后台运行命令并保持运行状态,即使注销控制台,请使用nohup

+0

这个问题被标记为Windows,而OP的代码是针对Windows的(例如运行“explorer”并使用'creationflags')。 – eryksun