[英]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.