2017-06-12 38 views
0

我使用Spyder 3.1.2(Python 2.7.13)。作为启动的一部分,IPython控制台设置为“Automatically load Pylab and NumPy modules”。Spyder无法识别导入的条款

时,我想使用的方法NumPy.zeros(形状),我只是把它在IPython的控制台为零:

In [12]: zeros(5) 
Out[12]: array([ 0., 0., 0., 0., 0.]) 

试图调用同一个零,从一种功能,当我的问题就来了单独的python文件。

如果我在一个文件中创建一个功能UseZeros()Test1.py

""" 
filename: Test1.py 
""" 

def UseZeros(): 
    return zeros(4) 

,我把它从一个单独的文件,Test2.py:

""" 
filename: Test2.py 
""" 

import Test1 

testArr1 = zeros(5) 
testArr2 = Test1.UseZeros() 

在此脚本,testArr1 =零(5)工作正常,但是当调用Test1.UseZeros()时,我得到一个错误,说明全局名称'零'没有定义。

File "C:/Users/Gareth/Test2.py", line 8, in testArr2 = Test1.UseZeros()

File "Test1.py", line 7, in UseZeros return zeros(4)

NameError: global name 'zeros' is not defined

是有人能够帮助我理解为什么调用这个函数时,IPython的控制台不再识别方法?

我能找到的similar problem的唯一参考在之前的版本中得到修复,与我所遇到的不同。

我需要这个工作的原因是我导入了其他人使用的功能,这些功能被广泛使用了诸如零,单词,罪,COS等命令,而且我不想重新定义一切。

感谢

回答

0

Spyder的开发商在这里)的选项自动加载提供方便在控制台交互工作Pylab和NumPy的模块,但它并不意味着在编辑器中编写代码,因为该代码将无法运行之外的Spyder 。

我不敢告诉你,但你的同事做了什么是一种非常糟糕的做法,并且我认为你所能做的最好的事情就是指导他/她解决这个问题。

在Spyder方面我们没有办法解决/改善这种情况,因为我们不愿意宣传不好的做法,对不起。

+0

感谢卡洛斯,我很欣赏这些反馈。将工作在我的同事身上,以便我们可以切换到更传统的工作结构化方式。 – GarethC

+0

非常感谢您的理解,我知道解决这个问题可能需要您一段时间。 –

+0

一点也不,我主要担心的是我无法工作,应该这样做。高兴地发现它的设计不会那样工作:) – GarethC

1

当你使用它时,import声明仍然具有模块内指定的所有函数和类:import numpy,例如,将允许您访问ndarray类为numpy.ndarray。如果要导入一个给定的类或函数到顶级命名空间,你就需要专门导入:

from numpy import ndarray 

如果你正在写的东西小,不担心弄乱的命名空间,你可以这样做:

from numpy import * 

在你的情况,与Spyder的自动进口它似乎只影响__main__级别的命名空间,所以你需要把正确的导入语句在任何导入模块。

+0

嗨Ben 感谢您的回复。问题是我不想修改我的同事代码。这个问题似乎不是导入,但重新定义了函数,例如,zeros = np.zeros,cos = np.cos等。 如果您向Test1添加了零= np.zeros,我提供的代码就可以工作。 py 我希望能有一种方法来使用他的代码,而不必添加所有的导入和定义,因为我通常可以不指定就调用函数。 – GarethC

+0

你知道你的同事是如何建立的吗?一般来说,我建议只调用'np.zeros',它会清楚地说明函数的定义和查找文档的位置。 –

+0

我的同事与我的设置相同。但是从同一个python文件中调用他的方法。但我想从我自己的python文件中调用他的方法,这是我在我的简单示例中演示的问题的来源。 – GarethC