无法导入同一级别的其他python模块
我有一个文件叫无法导入同一级别的其他python模块,python,django,flash-message,Python,Django,Flash Message,我有一个文件叫 server.py 另一个名为constants.py constants.py 与server.py处于同一级别 constants.py 以下是我正在做的: server.py import constants def hello_world(): print(BUCKET_NAME) 常数.py import constants def hello_world(): print(BUCKET_NAME) BUCKET\u NAME='uw note s
server.py
另一个名为constants.py
constants.py
与server.py处于同一级别
constants.py
以下是我正在做的:
server.py
import constants
def hello_world():
print(BUCKET_NAME)
常数.py
import constants
def hello_world():
print(BUCKET_NAME)
BUCKET\u NAME='uw note share'
我得到一个错误:
name错误:未定义全局名称“BUCKET\u name”
即使我正确地导入。问题是什么?尝试
from constants import BUCKET_NAME
print(BUCKET_NAME)
或者你可以
import constants
print(constants.BUCKET_NAME)
当我们导入一个模块时,我们将它作为一个单独的名称空间在当前程序中提供给我们。这意味着我们必须以点表示法引用函数,如在[module].[function]中所述。Try
from constants import BUCKET_NAME
print(BUCKET_NAME)
或者你可以
import constants
print(constants.BUCKET_NAME)
当我们导入一个模块时,我们将它作为一个单独的名称空间在当前程序中提供给我们。这意味着我们必须以点表示法引用函数,如在[module].[function]中所述。看看:
进入Python解释器并使用以下命令导入此模块:
导入fibo
这不会直接在当前符号表中输入fibo
中定义的函数名称;它只在那里输入模块名fibo
每个模块都有自己的专用符号表,该表由模块中定义的所有函数用作全局符号表。因此,模块的作者可以在模块中使用全局变量,而不用担心与用户的全局变量发生意外冲突。另一方面,如果您知道自己在做什么,您可以使用用于引用其函数的相同符号,modname.itemname
来触摸模块的全局变量
这看起来可能非常复杂,但它所说的基本上是,当您导入一个模块时,其所有内容都保留在一个单独的文件中,以防止冲突(即,两个模块中的两个变量具有完全相同的名称)
让我们以你为例。要使代码正常工作,您有两个选择
选项A
显式地告诉python您要查找的变量是在常量
模块中定义的
import constants
def hello_world():
print(constants.BUCKET_NAME)
选项B
同样,从以下方面:
import语句的一个变体是将名称从模块直接导入导入模块的符号表中
此变体如下所示:
from module import x
from constants import *
def hello_world():
print(BUCKET_NAME)
它的作用是从常量
模块中逐个导入所有内容。从那时起,python将该数据视为在当前模块中定义的数据
使用此方法,您可以执行以下操作:
from module import x
from constants import *
def hello_world():
print(BUCKET_NAME)
这里的*
告诉python从该模块导入所有内容。这在很多情况下都很方便,但是请注意,在处理大型模块时,这可能会导致性能问题。此外,请记住:
这不会在本地符号表中引入从中进行导入的模块名称
这意味着,如果您选择仅从常量导入BUCKET\u NAME
(from constants import BUCKET\u NAME
而不是import*
),将不会定义常量。如果不同时写入导入常量
,您将无法访问该模块中定义的其他变量
有关后一种方法的性能的更详细的解释,请参阅优秀的post by,以及常驻python master。请参阅:
进入Python解释器并使用以下命令导入此模块:
导入fibo
这不会直接在当前符号表中输入fibo
中定义的函数名称;它只在那里输入模块名fibo
每个模块都有自己的专用符号表,该表由模块中定义的所有函数用作全局符号表。因此,模块的作者可以在模块中使用全局变量,而不用担心与用户的全局变量发生意外冲突。另一方面,如果您知道自己在做什么,您可以使用用于引用其函数的相同符号,modname.itemname
来触摸模块的全局变量
这看起来可能非常复杂,但它所说的基本上是,当您导入一个模块时,其所有内容都保留在一个单独的文件中,以防止冲突(即,两个模块中的两个变量具有完全相同的名称)
让我们以你为例。要使代码正常工作,您有两个选择
选项A
显式地告诉python您要查找的变量是在常量
模块中定义的
import constants
def hello_world():
print(constants.BUCKET_NAME)
选项B
同样,从以下方面:
import语句的一个变体是将名称从模块直接导入导入模块的符号表中
此变体如下所示:
from module import x
from constants import *
def hello_world():
print(BUCKET_NAME)
它的作用是从常量
模块中逐个导入所有内容。从那时起,python将该数据视为在当前模块中定义的数据
使用此方法,您可以执行以下操作:
from module import x
from constants import *
def hello_world():
print(BUCKET_NAME)
这里的*
告诉python从该模块导入所有内容。这在很多情况下都很方便,但是请注意,在处理大型模块时,这可能会导致性能问题。此外,请记住:
这不会在本地符号表中引入从中进行导入的模块名称
这意味着,如果您选择仅从常量导入BUCKET\u NAME
(from constants import BUCKET\u NAME
而不是import*
),将不会定义常量。如果不同时写入导入常量
,您将无法访问该模块中定义的其他变量
关于后一种批准的性能的更详细解释