【发布时间】: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_PROCESS,CREATE_NO_WINDOW将被忽略,因为将它们组合起来毫无意义。DETACHED_PROCESS仅在不产生子控制台进程的情况下运行没有控制台的控制台应用程序才有意义,因为它们只会创建自己的控制台窗口。使用此标志,您还应该将标准句柄重定向到NUL设备。CREATE_NO_WINDOW适用于子进程,因为它们将继承无窗口控制台。同样,您可以使用STARTUPINFO隐藏控制台窗口。 -
是的,脚本通常应该有一个控制台,因为在第一部分中,我提示用户回答两个问题。至少现在是这样完成的,有可能在控制台以外的其他窗口中提示这些问题,我会在我回到办公室时尝试。关于 subprocess 方法的标志,我不太清楚它们是如何工作的,我只是用谷歌搜索找到了这些并尝试了不同的组合,感谢您让我了解更多细节!
标签: python subprocess multiprocessing windows-console