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

Ped*_*ues 6 python distutils

项目结构

\n
my_package\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_package\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_module.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n

该模块my_module.py有一个func我试图导入的函数。

\n

setup.py文件具有以下内容。

\n
my_package\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_package\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_module.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n

导入API

\n

我正在安装该软件包:

\n
virtualenv --python=/usr/bin/python3.8 venv\nsource venv/bin/activate\npython my_package/setup.py install\n
Run Code Online (Sandbox Code Playgroud)\n

然后使用以下命令导入它:

\n
from setuptools import setup, find_packages\n\nsetup(\n    name=\'my_package\',\n    packages=find_packages(where=\'my_package\'),\n    version=\'1.0\'\n)\n
Run Code Online (Sandbox Code Playgroud)\n

但是,第二次导入失败,并显示:

\n
ImportError: cannot import name \'my_module\' from \'my_package\' (unknown location)\n
Run Code Online (Sandbox Code Playgroud)\n

此外,运行dir(my_package)显示该my_module名称确实未导入。\n[\'__doc__\', \'__file__\', \'__loader__\', \'__name__\', \'__package__\', \'__path__\', \'__spec__\']

\n

SO类似问题

\n

如果解决方案证明不成功,则无法导入 setup.py 安装的包。

\n

ImportError:无法从“serial”(未知位置)导入名称“Serial”,添加__init__.py文件my_package/my_package不起作用。

\n

Git 仓库

\n

我已在GitLab上放置了该问题的示例

\n

0 0*_*0 0 9

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

其原因(也是问题的原因)是 Pythonsys.path在开始时自动将当前工作目录包含在 , 中,因此会尝试将主my_package目录作为包导入。