亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

導入錯誤:在沒有已知父包的情況下嘗試相對導入

導入錯誤:在沒有已知父包的情況下嘗試相對導入

嚕嚕噠 2022-08-25 14:04:35
我正在學習使用python編程,并且我在從包中的模塊導入時遇到問題。我正在使用Python 3.8.2 64位的visual studio代碼。.vscode├── ecommerce│   ├── __init__.py│   ├── database.py│   ├── products.py│   └── payments│       ├── __init__.py│       ├── authorizenet.py│       └── paypal.py├── __init__.py└── main.py在我擁有的文件中:ecommerce/products.py#products.pyfrom .database import Databasep = Database(3,2)這樣我就可以從文件中導入類。但是我收到錯誤Databaseecommerce/database.pyImportError : Attempted relative import with no known parent package
查看完整描述

4 回答

?
慕的地8271018

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.


查看完整回答
反對 回復 2022-08-25
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

Python文檔和實驗來看,似乎相對導入(涉及.,..等)僅在以下情況下有效:

  1. 導入模塊具有 除 以外的 一個,并且進一步說,__name____main__

  2. 導入模塊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.productsimport mainimport ecommerce.products

但是,如果您或從電子商務目錄中,或者從該電子商務目錄中輸入交互式python,它們將失敗。> python products.py> python -m productsimport products

添加是有幫助的

print("In module products __package__, __name__ ==", __package__, __name__)

等在每個文件中進行調試。

更新:

導入的工作方式取決于 和 ,而不是 。發出自 ,有一個 、 的 、 - 工作模塊的絕對導入,相對導入失敗。sys.path__package____name__/home/jj> python sub/mod.pysys.path__package__/home/jj/subNonesys.path

> python -m sub.mod有 , 的 , - 工作中模塊的絕對導入, 相對于 + 的導入工作。sys.path__package__/home/jjsubsys.pathsys.path__package__

添加更有幫助

import sys    
print("In module products sys.path[0], __package__ ==", sys.path[0], __package__)

等在每個文件中進行調試。


查看完整回答
反對 回復 2022-08-25
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

我在Windows上遇到了類似的問題,對我有幫助的是(適應你的目錄):


# local imports

import sys

sys.path.append(r"C:\path\to\your\project")


from ecommerce.database import Database


查看完整回答
反對 回復 2022-08-25
?
長風秋雁

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


查看完整回答
反對 回復 2022-08-25
  • 4 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號