繁体   English   中英

自定义模块中导入的Python库无法全局识别

[英]Python libraries imported in custom module is not recognised globally

我创建了一个名为my_module.py的模块,如下所示

import pandas as pd

def create_df(text):

    df = <create a dataframe from the text>

    return df

在Jupyter笔记本的单元格中,我可以创建一个这样的数据框

from my_module import create_df

txt = 'this is a test'
df = create_df(txt)

但是,在另一个单元格中,当我运行此查询时

pd.DataFrame?

它回来了

Object `pd.DataFrame` not found.

你能解释发生了什么吗? 我不应该在my_module.py中将import pandas as pd包括在内,但应该在笔记本中将import pandas as pd的单元格声明import pandas as pd吗?

在笔记本中,您导入了模块,但是您没有写:

import pandas as pd

因此, pandas不会被导入,也不会将pd添加到笔记本的命名空间中(请检查dir() ,您在笔记本中不会看到pd ),因此您的解释器不知道pd.DataFrame是什么。

我认为您的困惑源于您在模块中导入了pandas的事实,因此也将其导入到主脚本或笔记本中。 不,您需要再次导入它,因为在模块中进行的任何导入都不会继承到主脚本。

编辑 :更具体地说,在python中有一个命名空间的概念,它是与模块关联的全局变量的集合。

关键概念:每个模块都有自己的命名空间: numpy有一个, pandas有一个,您的main.py脚本有一个,并且它们是分开的。

例如,当在my_module.py中将import pandas as pd编写import pandas as pd时,就是将名称空间中的.pd pandas导入到my_module.py脚本中。 在那里,只有在那里,通过写pd. 您将能够访问库的组件。

如果现在from my_module import create_df main.py from my_module import create_df写入main.py (或笔记本),则将create_df添加到main.py的命名空间。 main.py不知道在my_module.py完成的导入,因为它不共享其命名空间,因此您不能使用pd. 这里。

同样,您不能在main.py而不是my_module.py main.py import pandas as pd ,并希望将其识别:您将调用create_df ,它将在my_modules.py命名空间中查找变量,而不是.pd ,它将引发错误。

顺便说一句,您可以使用内置方法dir(<module_name>)来查看在脚本的名称空间中加载了哪些变量。 默认情况下, dir()将为您提供调用脚本的名称空间,而dir(pd)将为您提供一个pandas (当然,前提是pd在名称空间中,即将pd import pandas as pd !)

希望它更清晰!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM