4 回答

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

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

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

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
考慮以下基本文件結(jié)構(gòu)
├── ecommerce
│ ├── __init__.py
│ ├── database.py
| └── products.py
└── main.py
我假設(shè)您正在從項(xiàng)目根目錄運(yùn)行。python main.py
以下是從Python教程復(fù)制的文本,解釋了有關(guān)相對(duì)導(dǎo)入的基本規(guī)則,
請(qǐng)注意,相對(duì)導(dǎo)入基于當(dāng)前模塊的名稱。因?yàn)橹髂K的名稱總是,所以用作Python應(yīng)用程序的主模塊的模塊必須總是使用絕對(duì)導(dǎo)入。__main__
所以下面的代碼會(huì)起作用,
# main.py
import ecommerce.products
# or to use it directly
# from ecommerce.products import my_product
ecommerce.products.my_product()
您的 product.py 可能看起來(lái)像這樣:
# 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...
你現(xiàn)在會(huì)得到,
> python main.py
Inside DB init
理想情況下,根目錄的文件不是必需的,因?yàn)榘Q是從電子商務(wù)開(kāi)始的。__init__.py
您也可以運(yùn)行命令直接調(diào)用 products.py。但這不會(huì)產(chǎn)生任何輸出,因?yàn)槲覀儧](méi)有調(diào)用my_product()函數(shù)(僅定義它)。python -m ecommerce.products
調(diào)用將不起作用,因?yàn)楫?dāng)前模塊的名稱將變?yōu)?而不是 。相對(duì)導(dǎo)入僅在當(dāng)前包中使用時(shí)才有效(因此在主腳本中,您始終需要導(dǎo)入包)。python ecommerce/products.py__main__ecommerceecommerce
添加回答
舉報(bào)