ImportError: cannot import name (unknown location)

ImportError: cannot import name (unknown location)

项目结构

my_package
├── my_package
│   ├── __init__.py
│   └── my_module.py
└── setup.py

模块 my_module.py 有一个 func 函数,我正在尝试导入。

setup.py 文件包含以下内容。

from setuptools import setup, find_packages

setup(
    name='my_package',
    packages=find_packages(where='my_package'),
    version='1.0'
)

导入API

我正在安装软件包:

virtualenv --python=/usr/bin/python3.8 venv
source venv/bin/activate
python my_package/setup.py install

然后导入:

import my_package
from my_package import my_module

然而,第二次导入失败:

ImportError: cannot import name 'my_module' from 'my_package' (unknown location)

此外,运行 dir(my_package) 表明确实没有导入 my_module 名称。 ['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

关于 SO 的类似问题

setup.py installed package can't be imported 提供的解决方案证明不成功。

my_package/my_package 中添加 __init__.py 文件无效。

Git 回购

我已经在 GitLab

中放置了一个问题示例

您正在 运行 在 my_package 目录的父目录中安装 test.py 脚本。因此,test.py 将尝试将 my_package 子目录导入为 package/module,而不是您安装的包。您需要移动到不包含您的源代码的目录,然后 运行 进行测试。这可能就像 运行 将它放在 my_package 主目录的子目录 test 中一样简单。
只需确保您 cd 明确进入该目录,而不是 运行 使用完整路径(例如 python3.8 my_package/test/test.py,因为那样它仍然会导入错误的 my_package.

这样做的原因(以及您的问题的原因)是 Python 在开始时自动将当前工作目录包含在您的 sys.path 中,因此将尝试导入主 my_package目录作为一个包。