ImportError:无法导入名称(未知位置)

时间:2020-09-03 16:49:16

标签: python distutils

项目结构

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提供的解决方案证明不成功。

ImportError: cannot import name 'Serial' from 'serial' (unknown location)__init__.py中添加my_package/my_package文件无效。

Git回购

我已在GitLab

放置了该问题的示例

1 个答案:

答案 0 :(得分:1)

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

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