【问题标题】:import libraries into python scrapy shell.将库导入 python scrapy shell。
【发布时间】:2014-05-16 17:44:53
【问题描述】:

我通过以下方式启动 shell:

scrapy shell 'some_url'

我想在 shell 中使用 numpy:

import numpy
a = numpy.random.random(2)
a = array([ 0.64836678,  0.72713776])

这些都运行良好。当我尝试在函数定义中使用 numpy 时,问题就来了:

In [23]: def foo(n): return numpy.random.random(n) 
In [24]: foo(2) 
In [24]: foo(2)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-24-3ab2f4e33a15> in <module>()
----> 1 foo(2)

<ipython-input-23-8383e2a3c452> in foo(n)
----> 1 def foo(n) : return numpy.random.random(n)

NameError: global name 'numpy' is not defined

我目前的解决方案是:

def foo(n) :import numpy ; return numpy.random.random(n)

有人可以帮助解释这个问题并提出更优雅的解决方案吗?

提前致谢。

【问题讨论】:

    标签: python namespaces scrapy


    【解决方案1】:

    当您执行numpy.random.random(n) 时,Python 在局部变量中查找numpy 名称,如果未找到,则在全局变量中查找。

    很明显,如果你没有导入 numpy 就没有这样的名字:

    NameError: global name 'numpy' is not defined 
    

    如果你这样做

    def foo(n) :import numpy ; return numpy.random.random(n)
    

    您导入numpy 模块并在本地(函数内部foo)变量numpy 中保留对它的引用。所以你的电话numpy.random.random(n) 工作正常。

    如果你将numpy 导入全局命名空间,它也可以工作:

    import numpy
    def foo(n):
        return numpy.random.random(n)
    

    确保你做了import numpy,因为这里一切正常:

    In [1]: import numpy
    
    In [2]: numpy.random.random(2)
    Out[2]: array([ 0.05183811,  0.18187864])
    
    In [3]: def foo(n): return numpy.random.random(n)
    
    In [4]: foo(2)
    Out[4]: array([ 0.19754933,  0.88955471])
    

    【讨论】:

    • 你好,warwaruk,请重新阅读我的问题。我的问题是:您的解决方案不适用于scrapy shell。谢谢
    • @johnniac,这里一切正常——查看我的更新
    • 我试过了,同样的错误。我的问题不是关于 ipython,而是关于 scrapy shell。谢谢,
    • 是的,那是scrapy shell
    • 嗯,有趣,我想我会重新安装包。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多