Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法导入同一级别的其他python模块_Python_Django_Flash Message - Fatal编程技术网

无法导入同一级别的其他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*
),将不会定义
常量。如果不同时写入
导入常量
,您将无法访问该模块中定义的其他变量

关于后一种批准的性能的更详细解释