簡體   English   中英

無法從 Python 3.7.1 中的其他目錄導入模塊

[英]Not able to import module from other directory in Python 3.7.1

我有一個 package 結構為:

在此處輸入圖像描述

這些包中的類的命名與文件名完全相同。 此外, init .py 有以下代碼

from tableau_util import tableau_util
from sftp_util import sftp_util
from s3_util import s3_util

我有另一個文件,例如 test.py,它位於此文件夾“utils”之外。 我想將這些類導入 test.py 所以我的代碼是

from utils.tableau_util import tableau_util
from utils.sftp_util import sftp_util
from utils.s3_util import s3_util

我仍然收到錯誤:

ModuleNotFoundError:沒有名為“tableau_util”的模塊

我可以嘗試什么來解決這個問題?

在不知道所有內容的情況下,我猜您正在嘗試將test.py作為普通的 python 腳本運行。 鑒於此文件夾結構

.
├── __init__.py
├── test
│   ├── __init__.py
│   └── test.py
└── utils
    ├── __init__.py
    ├── s3_util.py
    └── tableau_util.py

使用這些文件test.py

from utils.s3_util import s3_util
from utils.tableau_util import tableau_util

s3_util()
tableau_util()

import sys

print(sys.path)

s3_util.py

def s3_util():
    print('Im a s3 util!')

tableau_util.py

def tableau_util():
    print('Im a tableu util!')

如果您只是嘗試在主文件夾中運行python test/test.py ,它將為您提供ModuleNotFoundError 那是因為它將./test文件夾設置為 python 路徑,它將無法看到utils文件夾,因此無法導入它。 但是,如果您將其作為python -m test.test運行(注意缺少.py ,當您將其作為模塊運行時不需要它),這將告訴 python 將其作為模塊加載,然后它將正確運行這個 output:

Im a s3 util!
Im a tableau util!

如果您不想將test.py放在另一個文件夾中,您可以簡單地將其保存在utils的父文件夾中,並能夠在傳統的python test.py中運行它並獲得相同的結果。 查找“fibo.py”規范時出錯(<class 'AttributeError'>: 'module' object has no attribute '__path__')對此事有更多了解。

作為記錄,我的所有__init__.py文件都是空的,並且不導入任何東西,這通常是它們的設置方式,除非您想指定在自動導入模塊時需要導入的某些功能。

我使用 PyCharm 的 create package 選項再次創建文件夾和文件,它現在正在工作。 這是我的新(工作)文件夾結構:
在此處輸入圖像描述

我的主腳本有以下代碼行來導入這些類:

from utils_pkg import tableau_util
from utils_pkg import s3_util
from utils_pkg import sftp_util

首先,在__init__.py中(或在任何試圖從同一個包中導入其兄弟姐妹的子模塊中),您應該在模塊名稱的開頭添加一個“相對導入”點,以便它讀取:

from .tableau_util import tableau_util
#    ^right here

其次,確保您當前的工作目錄不是utils 一個好的開始測試的地方可能是cdutils的父目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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