这些软件包中的类的命名与文件名完全相同。另外, 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'的模块。有人可以帮助我解决这个愚蠢的问题吗? TIA
答案 0 :(得分:0)
我一无所知,我猜您正在尝试将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 s3_util():
print('Im a s3 util!')
如果您只是尝试在主文件夹中运行python test/test.py
,它将为您提供ModuleNotFoundError
。这是因为它将./test
文件夹设置为python路径,并且无法看到utils
文件夹,因此无法将其导入。但是,如果您以python -m test.test
的身份运行(请注意,缺少.py
作为模块运行时就不需要它),它将告诉python将其作为模块加载,然后它将运行正确显示此输出:
Im a s3 util!
Im a tableau util!
如果您不想将test.py
放置在另一个文件夹中,则只需将其保存在utils
的父文件夹中,然后就可以在传统的python test.py
中运行它,并且得到相同的结果。 Error while finding spec for 'fibo.py' (<class 'AttributeError'>: 'module' object has no attribute '__path__')对此有更多了解。
为了记录,我的所有__init__.py
文件都是空的,什么也不导入,这通常是它们的设置方式,除非您要指定在自动导入模块时需要导入的某些功能。 / p>
答案 1 :(得分:0)
首先,在__init__.py
内部(或试图从同一包中导入其同级之一的任何子模块中),应在模块名称的开头添加“相对导入”点,以便它显示为:
from .tableau_util import tableau_util
# ^right here
第二,确保您当前的工作目录不是utils
。开始进行测试的一个好地方可能是cd
到utils
的父目录。
答案 2 :(得分:0)