我在package
目录中有以下结构:
├── bin
│ └── package.py
├── package
│ ├── __init__.py
│ └── a_file.py
└── setup.py
a_file.py
:
def a(): pass
__init__.py
:
from .a_file import a
bin/package.py
:
#!/usr/bin/env python
from package import a
setup.py
:
setup(name='package',
version='0.1',
description='',
url='',
author='',
author_email='',
license='MIT',
packages=['package'],
scripts=['bin/package.py'],
zip_safe=False)
我使用以下方法安装软件包:
pip install -e .
当我从命令行运行$ package.py
时,错误是:
ImportError: cannot import name 'a' from partially initialized module 'package' (most likely due to a circular import)
据我了解,这显然不是循环进口。bin/package.py
通过package/__init__.py
package/a_file.py
进口。而且package/a_file.py
不导入任何东西。
这里真正的问题是什么?
bin/package.py
导入
package/a_file.py
到package/__init__.py
不,bin/package.py
导入package
,Python 正在尝试从该bin/package.py
导入任何名称。这是因为 Python 会自动将脚本的目录(在您的情况下bin
(附加到sys.path
因此任何与package
相关的导入都来自bin/package.py
,而不是从package/
导入。
切勿将脚本命名为与现有包相同的名称,尤其是标准库中的包。切勿创建脚本email.py
、test.py
等。
将bin/package.py
重命名为仅package
(无扩展名(或任何其他名称。