无法导入同一级别的另一个python模块

时间:2017-06-10 09:20:31

标签: python django flash-message

我有一个名为

的文件
server.py

另一个叫constants.py

constants.py

server.py

处于同一级别

这是我正在做的事情:

server.py

import constants
def hello_world():
   print(BUCKET_NAME)

constants.py

BUCKET_NAME = 'uw-note-share'

我收到错误:

NameError: global name 'BUCKET_NAME' is not defined

即使我正在导入。有什么问题?

3 个答案:

答案 0 :(得分:3)

查看documentation

  

输入Python解释器并使用以下命令导入此模块:   import fibo   这不会直接在当前符号表中输入fibo中定义的函数的名称;它只在那里输入模块名fibo

     

每个模块都有自己的私有符号表,该表用作模块中定义的所有函数的全局符号表。因此,模块的作者可以在模块中使用全局变量,而不必担心与用户的全局变量的意外冲突。另一方面,如果您知道自己在做什么,则可以使用与其函数modname.itemname相同的符号来触摸模块的全局变量。

这可能看起来非常复杂,但它所说的基本上是,当你导入一个模块时,它的所有内容都保留在一个单独的namespace中以防止冲突(即两个模块中的两个变量具有确切的结果)一样的名字)。

让我们举个例子。要使代码正常工作,您有两种选择。

选项A

明确告诉python你正在寻找的变量是在constants模块中定义的。

import constants
def hello_world():
   print(constants.BUCKET_NAME)

选项B

再次,来自documentation

  

import语句的一个变体是将模块中的名称直接导入导入模块的符号表。

此变体如下:

from module import x

这样做是从constants模块逐个导入所有内容。从那时起,python将该数据视为在当前模块中定义的数据。

使用此方法,您可以执行以下操作:

from constants import *
def hello_world():
   print(BUCKET_NAME)

这里*告诉python从该模块导入所有。这在很多情况下很方便,但是请注意,这可能会在处理大型模块时导致性能问题。另外,请记住:

  

这不会引入从本地符号表中获取导入的模块名称

这意味着如果您选择仅从常量(BUCKET_NAME而不是from constants import BUCKET_NAME)导入import *,则constants将无法定义。如果没有 编写import constants,您将无法访问该模块中定义的其他变量。

有关后一种方法的性能的更详细解释,请查看this Roberto Liffredo的优秀帖子,以及常驻python master thisMartijn Pieters }。

答案 1 :(得分:2)

尝试,

from constants import BUCKET_NAME
print(BUCKET_NAME)

或者你可以,

import constants
print(constants.BUCKET_NAME)

当我们导入模块时,我们将在当前程序中将它作为单独的命名空间提供给我们。这意味着我们必须以点表示法引用函数,如[module]。[function]。

答案 2 :(得分:0)

您正在尝试导入整个文件。您可以通过两种方式使其工作,

import constants
def hello_world():
   print(constants.BUCKET_NAME)

OR

from constants import BUCKET_NAME
def hello_world():
   print(BUCKET_NAME)

我希望这会对你有所帮助。