导入使用和不使用主范围

时间:2017-08-23 14:50:32

标签: python python-import

我在同一目录中有两个文件app.pydatabase.py。 主要是我有以下代码片段:

app.py

import database
db = "demo_database"
print(database.show_database_information())

database.py

from app import db
database_username = "root"
database_password = "password"
def show_database_information():
    information = {}
    information["filename"] = db
    information["username"] = database_username
    information["password"] = database_password
    return information

当我尝试运行app.py时出现以下错误:

Traceback (most recent call last):
  File "K:\PyPrac\circular_call\app.py", line 1, in <module>
    import database
  File "K:\PyPrac\circular_call\database.py", line 1, in <module>
    from app import db
  File "K:\PyPrac\circular_call\app.py", line 3, in <module>
    print(database.show_database_information())
AttributeError: module 'database' has no attribute 'show_database_information'

然后我更新了app.py并包含__main__,如下所示:

app.py

import database
db = "demo_database"
if __name__ == '__main__':
    print(database.show_database_information())

现在它运行顺利,没有任何错误。

我有几个问题,

  1. 第一个场景中出现错误的名称是什么?需要解释。
  2. 为什么在包含__main__范围后运行?
  3. 做这样的操作的更好方法是什么?

2 个答案:

答案 0 :(得分:2)

我能理解的是如下。也许更专家的人可以详细说明!

  1. 导入错误。
  2. if __name__ == '__main__':此条件用于检查python模块是直接运行还是正在导入。
  3. 如果导入模块,则__name__是模块的名称而不是main。因此,在这种情况下,最好拨打if __name__ == '__main__':

答案 1 :(得分:1)

曼!!你正在创造一个循环的时刻。我告诉你怎么做。

import database  # from app.py

但是从database.py你从app导入数据库。那就是创造一个循环的时刻。

另一方面,

if __name__ == '__main__':  

这会让您database.py作为模块的名称,而不是__main__,这就是它工作的原因。没有什么神奇的:)

更新:在from app import db函数中放置show_database_information()这一行 这是你的HOTFIX。