【问题标题】:ImportError: cannot import name (unknown location)ImportError:无法导入名称(未知位置)
【发布时间】:2020-09-03 16:49:16
【问题描述】:

项目结构

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)my_package/my_package 中添加__init__.py 文件无效。

Git 仓库

我已在GitLab 放置了一个问题示例

【问题讨论】:

  • 要清楚,您是否尝试在my_package/my_package 中添加__init__.py?也许内容import .my_module
  • @GreenCloakGuy 是的。我已经更新了问题中的最后一个短语。 __init__.py 被放置在 my_package/my_package 中。添加你刚才说的导入,也没有用。
  • 您从哪个(目录)位置运行使用from my_package import my_module的脚本(或Python提示符)?
  • @00 检查gitlab.com/prodrigues1990/import-setup/-/jobs/718813294 看看它是否回答了您的问题
  • 您也可以在venv/lib/python3.8/site-packages/my_package 中查看my_module.py 是否存在。

标签: python distutils


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2021-03-21
    • 2020-09-08
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多