2014-08-27 27 views
0

我使用python腳本作爲啓動程序來啓動長時間運行的java服務。無標準輸出輸出的啓動過程

call = [ "java", "-cp", ... ] 

with open(os.devnull, 'w') as fnull: 
    subprocess.Popen(call, stdout=fnull) 
    print "Service started." 

但是當python進程完成後,我仍然從java進程獲取stdout輸出。我認爲這是因爲python關閉了我的fnull,因此它恢復爲正常的stdout。

我怎樣才能達到我想要的?

編輯:在一個側面說明,如果可能,仍然會很好,但不會增加任何複雜性。

編輯2:這似乎是我非常愚蠢的,這是正在寫的stderr。

+1

你確定它確實是'stdout'而不是'stderr'你看到了嗎? – FatalError 2014-08-27 17:04:05

+2

'stdout'指向'/ dev/null',你看不到它。你的java進程可能發送消息到'stderr'。 – 2014-08-27 17:05:07

+0

一旦子進程分叉,父文件描述符會發生什麼並不重要。孩子得到/ dev/null。將我的投票加入stderr假設。 – tdelaney 2014-08-27 17:09:33

回答

-1

如果你是用好讓python腳本現場

Popen.communicate(輸入=無)

與互動的過程:將數據發送至標準輸入。從stdout和stderr中讀取數據,直到達到文件結尾。等待進程終止。可選的輸入參數應該是要發送到子進程的字符串,如果沒有數據應該發送給子進程,則爲None。

+0

'communic()'只捕獲stdout和stderr,如果它們指向'popen.PIPE',在這裏不是這種情況。 – 2014-08-27 17:09:10

0

部分回答附註,它容易得到stderr(當你想要stdout和stderr時它更復雜)。它有一個額外的好處,它會告訴你,你認爲在標準輸出上的java輸出是否真的在stderr上。

call = [ "java", "-cp", ... ] 

with open(os.devnull, 'w') as fnull: 
    subprocess.Popen(call, stdout=fnull, stderr=subprocess.PIPE) 
    print "Service started." 
for line in stderr: 
    print 'stderr: ', line.strip()