2015-09-09 215 views
1

我通過php exec函數在本地執行python腳本,並且一切正常。 現在,我需要在服務器中移動項目,並且在執行相同的python腳本時遇到了一些問題。Python腳本從服務器執行時崩潰

在這兩種情況下,我都有相同版本的Python(2.7.3),並且安裝了所有必需的庫。 我發現問題的創建地點,但我找不出原因。 其此行中我的python腳本:

import networkx as nx 
CG1_nodes=nx.connected_components(G1)[:] 

它成功地運行在本地,但它在服務器崩潰。我發現如果我刪除:

[:] 

然後它工作。我也檢查了G1的內容和它的填充。 有什麼想法我在這裏失蹤?

+0

我知道python腳本崩潰了。 – user1919

+0

你怎麼知道腳本崩潰? –

+1

我做了一件很簡單的事情。我試圖在上面顯示的代碼行後面打印一個值。沒有回報。我想這意味着腳本停止運行。 – user1919

回答

2

您正在使用發電機。它有可能有數十億件物品。如果是這樣的話 - python可能沒有資源。通過檢查結果列表的大小,確保不會超載系統。

我還會看看networkx(NumPy?SciPy?)使用的庫中的切片問題。也許嘗試:

CG1_nodes=list(nx.connected_components(G1)) 

爲了避免切片。

+0

感謝您的回答。我不認爲這是問題。那麼它也不適用於本地的權利?此外,我沒有太多的項目在列表中。當然不是數十億。 – user1919

+0

感謝您的編輯。我認爲這可能會有所幫助。但我不明白爲什麼它在本地服務器上正常運行,並在服務器中出現問題。你有什麼主意嗎?也許我需要在服務器端改變某些屬性? – user1919

+0

相同的操作系統?相同的Python版本? –

2

您應該檢查兩種情況下是否具有相同版本的networkx。

在早期的networkx版本nx.connected_components(G1)是一個列表。在較新的版本(1.9.1)中,它是一個生成器。如果X是生成器,則X[:]不起作用。但是,如果X是它的列表。所以如果你的機器和服務器有不同的版本,那麼在一種情況下,它是允許的,但不是其他版本。

您通過刪除[:]來「固定」這個,因此CG1_nodes現在是一個生成器而不是一個列表。只要你早期使用它與一個生成器一致,結果將(可能)是相同的。所以這兩個代碼將起作用。顯然明確地將其列入清單將會起作用,但可能是內存密集型的。

更多細節記錄在here。特別注意:

要恢復先前的行爲,請使用list(connected_components(G))

我相信以前的版本返回按減小的組件大小排序的列表。新版本沒有排序。如果你需要它,你需要做更多的事情:

sorted(list(nx.connected_components(G)), key = len, reverse=True) 
+0

謝謝。非常有用的評論。你能告訴我如何檢查Ubuntu中的networkx版本嗎? – user1919

+1

在python中,你可以做'import networkx as nx'然後'print nx .__ version__'。版本1.9.1發生了變化(我認爲) – Joel

+0

就是這樣。在一個OS中,我有networkx-1.9.1,另一個是networkx-1.8.1非常有用的評論。謝謝。 – user1919