[英]Why my __init__.py doesn't work in the module?
我正在嘗試將 'project_root' 添加到__init__.py
中,所有模塊都可以使用它,但它不起作用。
環境:Python 3.7.0 MACOS MOJAVE
文件結構
·
├── __init__.py
└── a.py
__init__.py
文件中的代碼:
import sys
project_root = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(project_root)
在另一個文件中
print(project_root)
如果我在同一個目錄中運行python a.py
a.py,或者在目錄外運行python a.py
,錯誤如下:
Traceback (most recent call last):
File "a.py", line 1, in <module>
print(project_root)
NameError: name 'project_root' is not defined
我的問題是為什么它不起作用以及如何解決它。 另一個問題是,如果你想為同一個 package 中的其他模塊共享一些變量怎么辦?
讓我們試着通過例子來理解。
假設我們有以下目錄和文件結構:
dir_1
├── __init__.py
└── a.py
b.py
__init__.py
包含:
import sys,os
# Just to make things clear
print("Print statement from init")
project_root = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(project_root)
a.py
包含:
def func():
print("func from a.py")
假設您從b.py
中的以下代碼開始:
from dir_1.a import func
func()
執行上面會給出如下output:
從 init 打印語句
來自 a.py 的函數
所以,從上面我們了解到,來自__init__.py
的print
語句正在被執行。 現在,讓我們在b.py
中添加print(project_root)
:
from dir_1.a import func
func()
print(project_root)
執行上述將導致錯誤提示:
...
NameError:名稱“project_root”未定義
發生這種情況是因為我們不必從__init__.py
導入print
語句,它只是被執行。 但對於變量而言,情況並非如此。
讓我們嘗試導入變量,看看會發生什么:
from dir_1.a import func
from dir_1 import project_root
func()
print(project_root)
執行上述文件會得到如下output:
從 init 打印語句
來自 a.py 的函數
/home/user/some/directory/name/dir_1
長話短說,您需要導入在__init__.py
或其他任何地方定義的變量才能使用它。
希望這可以幫助: )
您必須導入變量:
from dir import project_root
dir 是你所在的目錄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.