[英]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
文件都是空的,並且不導入任何東西,這通常是它們的設置方式,除非您想指定在自動導入模塊時需要導入的某些功能。
首先,在__init__.py
中(或在任何試圖從同一個包中導入其兄弟姐妹的子模塊中),您應該在模塊名稱的開頭添加一個“相對導入”點,以便它讀取:
from .tableau_util import tableau_util
# ^right here
其次,確保您當前的工作目錄不是utils
。 一個好的開始測試的地方可能是cd
到utils
的父目錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.