2015-09-09 177 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