簡體   English   中英

無法導入同一級別的另一個python模塊

[英]Unable to import another python module same level

我有一個名為

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

即使我正確導入。 有什么問題

看一下文檔

輸入Python解釋器並使用以下命令導入該模塊: import fibo這不會直接在當前符號表中輸入fibo中定義的函數的名稱。 它僅在此處輸入模塊名稱fibo

每個模塊都有自己的專用符號表,模塊中定義的所有功能都將其用作全局符號表。 因此,模塊的作者可以在模塊中使用全局變量,而不必擔心與用戶的全局變量的意外沖突。 另一方面,如果您知道自己在做什么,則可以使用與引用modname.itemname功能相同的符號modname.itemname來觸摸模塊的全局變量。

這看似非常復雜,但是它的含義基本上是,當您導入模塊時,其所有內容都保留在單獨的命名空間中,以防止發生沖突(即,兩個模塊中兩個變量的名稱完全相同)。

讓我們舉個例子。 為了使代碼正常工作,您有兩種選擇。

選項A

明確告訴python,您要查找的變量是在constants模塊中定義的。

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

選項B

同樣,從文檔中

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

有關后者的表現手法更詳細的解釋,看看這個優秀的職位由羅伯特·Liffredo ,以及這個由居民蟒蛇主人的Martijn Pieters的

試試看

from constants import BUCKET_NAME
print(BUCKET_NAME)

或者你可以

import constants
print(constants.BUCKET_NAME)

導入模塊時,我們將其作為單獨的命名空間在當前程序中提供給我們。 這意味着我們將不得不以點表示法引用該函數,如[module]。[function]中所示。

您正在嘗試導入整個文件本身。 您可以通過兩種方式使它工作,

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

要么

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

我希望這可以幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM