2017-09-12 64 views
0

我正在編寫一個小應用程序,它只需按幾下按鈕就可以使用「索引文件」在資源管理器中打開文件夾。無論如何,我想在每次關閉應用程序時在「後臺進程」中更新該索引文件。更新索引文件意味着通過我們的網絡進行掃描,對於一些遠程用戶,這可能需要幾分鐘的時間。這就是爲什麼我希望它在掃描過程中隱藏控制檯,以避免進程被用戶中止。進程正在運行時關閉控制檯

我試過類似幾件事情:

#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

這不是你正在尋找的答案,但你可以重新設計你的系統架構:將你的索引更新器寫成一個服務器進程,它通過套接字與你的實際應用進行通信。然後,您只需要索引更新程序服務器進程連續運行(甚至可以在另一臺機器上運行),並讓索引更新程序進行所有耗時的工作。

+0

就像你說的不完全是我在找什麼。當然,這可能是一個解決方案,但我不想做這麼大的腳本。建立這樣的服務意味着更多的工作,並讓公司中的其他人能夠主持這種服務。與僅使用時更新的網絡上存儲的索引文件相比。 – Saftblandaren

0

如果您只想執行以特定間隔發生的後臺任務,請使用cron。如果要在後臺運行命令並保持運行狀態,即使註銷控制檯,請使用nohup

+0

這個問題被標記爲Windows,而OP的代碼是針對Windows的(例如運行「explorer」並使用'creationflags')。 – eryksun

相關問題