[英]unable to import python file module which is inside the another directory of the same level
[英]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.