从服务器执行时,Python脚本崩溃

时间:2015-09-09 07:21:58

标签: python networkx

我通过php exec函数在本地执行python脚本,一切正常。 现在我需要在服务器中移动项目,并且在执行相同的python脚本时遇到一些问题。

在这两种情况下,我都使用相同版本的Python(2.7.3)并安装了所有必需的库。 我已经发现了问题的创建地点,但我无法弄清楚原因。 它在我的python脚本中的这一行:

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

它在本地成功运行但在服务器中崩溃。我发现如果我删除了:

[:]

然后它的工作原理。我还检查了G1及其填充的内容。 知道我在这里缺少什么吗?

2 个答案:

答案 0 :(得分:2)

你正在消耗一台发电机。它可能有数十亿件物品。如果是这样的话 - python可能没有资源。通过检查结果列表的大小,确保您不会超载系统。

我还要看一下networkx(NumPy?SciPy?)使用的库中切片的问题。也许试试:

CG1_nodes=list(nx.connected_components(G1))

避免切片。

答案 1 :(得分: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)