繁体   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