簡體   English   中英

為什么我的 __init__.py 在模塊中不起作用?

[英]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__.pyprint語句正在被執行。 現在,讓我們在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.

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