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'
)
我要通过以下方式安装软件包:
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__']
setup.py installed package can't be imported提供的解决方案证明不成功。
ImportError: cannot import name 'Serial' from 'serial' (unknown location)在__init__.py
中添加my_package/my_package
文件无效。
我已在GitLab
放置了该问题的示例答案 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
目录导入为一个包装。