![](/img/trans.png)
[英]python script works from command line but not when it is executed from webapplication
[英]Python script crashes when executed from server
我正在通過php exec函數在本地執行python腳本,並且一切正常。 現在是時候該在服務器中移動項目了,執行相同的python腳本時遇到了一些問題。
在這兩種情況下,我都有相同版本的Python(2.7.3),並且安裝了所有必需的庫。 我發現了問題的出處,但我不知道為什么。 這是我的python腳本中的這一行:
import networkx as nx
CG1_nodes=nx.connected_components(G1)[:]
它在本地成功運行,但在服務器中崩潰。 我發現如果刪除:
[:]
然后就可以了。 我還檢查了G1的內容及其填充。 知道我在這里缺少什么嗎?
您正在消耗發電機。 它可能有數十億個項目。 如果是這種情況,則python可能資源不足。 通過檢查結果列表的大小來確保您不會使系統超載。
我還將研究networkx
(NumPy?SciPy?)使用的庫中的切片問題。 也許嘗試:
CG1_nodes=list(nx.connected_components(G1))
避免切片。
在兩種情況下,您都應檢查您是否具有相同版本的networkx。
在較舊的networkx版本中,列表為nx.connected_components(G1)
。 在較新的版本(1.9.1)中,它是一個生成器。 如果X
是生成器,則X[:]
不起作用。 但是,如果X
是一個列表,它就可以。 因此,如果您的計算機和服務器具有不同的版本,則在一種情況下是允許的,但在另一種情況下則不允許。
您通過刪除[:]
“修復”此問題,因此CG1_nodes
現在是生成器,而不是列表。 只要您之前使用它與生成器一致,結果(可能)是相同的。 因此,這兩個代碼將起作用。 顯然,明確地將其設為列表是可行的,但可能會占用大量內存。
更多詳細信息在此處記錄 。 特別注意:
若要恢復以前的行為,請使用
list(connected_components(G))
。
我相信以前的版本會返回按減小的組件大小排序的列表。 新版本未排序。 如果需要對它進行排序,則需要做更多的事情:
sorted(list(nx.connected_components(G)), key = len, reverse=True)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.