无法从Python 3.7.1中的其他目录导入模块

时间:2019-10-24 23:09:22

标签: python python-3.x

我有一个结构如下的软件包: enter image description here

这些软件包中的类的命名与文件名完全相同。另外, 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

3 个答案:

答案 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。开始进行测试的一个好地方可能是cdutils的父目录。

答案 2 :(得分:0)

我使用了PyCharm的create package选项来再次创建文件夹和文件,并且现在可以使用了。这是我的新文件夹(工作文件夹):
enter image description here

我的主脚本有以下几行代码可导入这些类:

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