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

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 是一个列表,它就会这样做。所以如果你的机器和服务器有不同的版本,那么在一种情况下是允许的,但在另一种情况下是不允许的。

你 "fixed" 通过删除 [:],所以 CG1_nodes 现在是一个生成器而不是列表。只要您之前对它的使用与生成器一致,结果(可能)是相同的。所以这两个代码会起作用。显然,将其明确列为一个列表是可行的,但可能会占用大量内存。

记录了更多详细信息 here。特别注意:

To recover the earlier behavior, use list(connected_components(G)).

我相信以前的版本返回了按组件大小递减排序的列表。新版本未排序。如果您需要对其进行排序,则需要做更多的事情:

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