最小 pip 托管 Python 包中的部分初始化模块



我在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__.pypackage/a_file.py进口。而且package/a_file.py不导入任何东西。

这里真正的问题是什么?

bin/package.py导入

package/a_file.pypackage/__init__.py

不,bin/package.py导入package,Python 正在尝试从该bin/package.py导入任何名称。这是因为 Python 会自动将脚本的目录(在您的情况下bin(附加到sys.path因此任何与package相关的导入都来自bin/package.py,而不是从package/导入。

切勿将脚本命名为与现有包相同的名称,尤其是标准库中的包。切勿创建脚本email.pytest.py等。

bin/package.py重命名为仅package(无扩展名(或任何其他名称。

最新更新