python - Python 导入后,调用定义会生成 NameError

标签 python python-2.7 python-import

我是 python 新手,我正在尝试执行以下操作:

我有一个名为 app 的文件夹,该文件夹有两个文件:main.py 和 init.py

main.py

def generate_report(x1, x2):
    print "Generating report..."
    print x1
    print x2 

if __name__ == "__main__":
    print "Running: main.py..."

    generate_reports(1, 2)

    print "Done!"

else:
    print "Imported: main.py..."

__init__.py

import main

如果我这样做,现在在我的控制台中:

import app

我得到:

Imported: main.py...

那么如果我尝试这样做:

generate_report(1, 2)

我收到以下错误:

NameError: name 'generate_report' is not defined

最佳答案

Python 中的模块命名空间有两种不同的方法。其中一种方法是 import blah,然后使用 blah.spam 访问 blah 的元素。在另一个例子中,您可以说 from blah import spam (或 *),然后直接通过名称访问 blah 的元素。

问题是,您必须在每个级别上做出决定:如果您有一个包,您需要做出两个这样的决定:您的脚本如何导入包(在您的情况下是app),以及应用程序的 __init__.py 如何导入 main (顺便说一句,这是一个可怕的模块名称;P)。

因此,一种解决方案是编写

from app import main

在你的__init__.py中,并且

from app import generate_report

在你的脚本中,另一个是写

app.main.generate_report

在你的脚本中。当然,还有其他两种方式,有些是直接导入,有些是 fromed。

关于python - Python 导入后,调用定义会生成 NameError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32889386/

相关文章:

python - 编写Python版本独立代码: struct.包

python - 格式化包含非 ascii 字符的列

python - 如何在 python 中将 JSON 转换为 Dataframe

python - ipython 中有趣的导入行为

python - 使用 Selenium 登录网站,但继续处理(登录时)请求

python - 分割数据帧并根据循环写入新的 csv

python - 如何从 Dragon NaturallySpeaking 中的高级脚本语音命令调用 python 函数?

python-2.7 - 获取与列中最大值关联的行数据(Python/Pandas)

python - Python中导入azure.servicebus错误

python - 从子模块上的模块调用函数