4 回答

TA貢獻1796條經驗 獲得超4個贊
由于您使用的是Python 3.8版本,因此導入的工作方式略有不同,但我認為這應該有效:
使用以下任一方法:
from database import Database
#Database is the class
或嘗試:
import database.Database
最后,這個是非常安全的,可能是最佳實踐:
from . import Database
# The '.' (dot) means from within the same directory as this __init__.py module grab the Database class.

TA貢獻1847條經驗 獲得超7個贊
從Python文檔和實驗來看,似乎相對導入(涉及.,..等)僅在以下情況下有效:
導入模塊具有 除 以外的 一個,并且進一步說,
__name__
__main__
導入模塊pkg.module_name,即它必須從目錄層次結構的上方導入(要有一個父 pkg 作為其一部分)。
__name__
__name__
或
導入模塊是通過包含父 pkg 的模塊語法指定的,在這種情況下,它仍然是 ,因此它作為腳本運行,但相對導入將起作用。這里設置并用于查找父包,而 是 ;更多 這里.python -m pkg.module
__name__
__main__
__package__
__name__
__main__
[畢竟,這似乎是確定相對進口是否/如何運作的關鍵。 表示腳本或模塊(即或 )。 指示相對導入相對于包中出現的位置,并且頂部需要在 .] 中。__package__
sys.path
__name__
__main__
module_name
__package__
__package__
sys.path
因此,繼續@AmitTendulkar的示例,如果您將其作為或從項目根目錄運行,或者從該根目錄和輸入交互式python,或者 products.py 中的相對導入將起作用。> python main.py
> python -m main
> python -m ecommerce.products
import main
import ecommerce.products
但是,如果您或從電子商務目錄中,或者從該電子商務目錄中輸入交互式python,它們將失敗。> python products.py
> python -m products
import products
添加是有幫助的
print("In module products __package__, __name__ ==", __package__, __name__)
等在每個文件中進行調試。
更新:
導入的工作方式取決于 和 ,而不是 。發出自 ,有一個 、 的 、 - 工作模塊的絕對導入,相對導入失敗。sys.path
__package__
__name__
/home/jj
> python sub/mod.py
sys.path
__package__
/home/jj/sub
None
sys.path
> python -m sub.mod
有 , 的 , - 工作中模塊的絕對導入, 相對于 + 的導入工作。sys.path
__package__
/home/jj
sub
sys.path
sys.path
__package__
添加更有幫助
import sys print("In module products sys.path[0], __package__ ==", sys.path[0], __package__)
等在每個文件中進行調試。

TA貢獻1794條經驗 獲得超8個贊
我在Windows上遇到了類似的問題,對我有幫助的是(適應你的目錄):
# local imports
import sys
sys.path.append(r"C:\path\to\your\project")
from ecommerce.database import Database

TA貢獻1757條經驗 獲得超7個贊
考慮以下基本文件結構
├── ecommerce
│ ├── __init__.py
│ ├── database.py
| └── products.py
└── main.py
我假設您正在從項目根目錄運行。python main.py
以下是從Python教程復制的文本,解釋了有關相對導入的基本規則,
請注意,相對導入基于當前模塊的名稱。因為主模塊的名稱總是,所以用作Python應用程序的主模塊的模塊必須總是使用絕對導入。__main__
所以下面的代碼會起作用,
# main.py
import ecommerce.products
# or to use it directly
# from ecommerce.products import my_product
ecommerce.products.my_product()
您的 product.py 可能看起來像這樣:
# ecommerce/products.py
from .database import Database
def my_product():
p = Database(3, 2)
database.py 將如下所示,
# ecommerce/database.py
class Database():
def __init__(self, x, y):
self._x = x
self._y = y
print('Inside DB init')
# Rest of the methods...
你現在會得到,
> python main.py
Inside DB init
理想情況下,根目錄的文件不是必需的,因為包名稱是從電子商務開始的。__init__.py
您也可以運行命令直接調用 products.py。但這不會產生任何輸出,因為我們沒有調用my_product()函數(僅定義它)。python -m ecommerce.products
調用將不起作用,因為當前模塊的名稱將變為 而不是 。相對導入僅在當前包中使用時才有效(因此在主腳本中,您始終需要導入包)。python ecommerce/products.py__main__ecommerceecommerce
添加回答
舉報