E1097: unknown attribute "no_init_all" in WinNT.h in Windows SDK 10.0.18362.0

本文介绍了解决在使用VS2019编译时遇到的winnt.h中no_init_all属性错误的方法。通过在预编译头文件中加入特定代码,可以有效避免此错误,适用于遇到同样问题的开发者。

在我使用最新(2019.5.12)的VS2019(版本号16.0.3)时,编译器弹出了如标题所示错误,找不到"no_init_all"的attribute。错误源头在winnt.h这一系统头文件中。
经过比对,找到了位于Microsoft Visual Studio Developer Community的一篇文章中提到了关闭错误的方式
只需要在winnt.h头文件中

#if (_MSC_VER >= 1915)
#pragma warning(disable:4845)   // __declspec(no_init_all) used but d1initall not set
#endif
1
2
3
这一预编译头之后加上

#if (_MSC_VER >= 1915)
#define no_init_all deprecated
#endif
1
2
3
即可消除错误提示
值得一提的是

#if (_MSC_VER >= 1915)
#pragma warning(disable:4845)   // __declspec(no_init_all) used but d1initall not set
#endif
1
2
3
这一代码块是微软工程师用于在旧版本的VS中消除该错误提示的预编译头
虽然微软的工程师们宣称他们在最新的VS2019中已经修复了该错误,但是仍有很多人受到了该错误的困扰。
--------------------- 
作者:一般通过海狗 
来源:优快云 
原文:https://blog.youkuaiyun.com/weixin_44749766/article/details/90147106 
版权声明:本文为博主原创文章,转载请附上博文链接!

<think> 我们面对的错误是:`AttributeError: module '__init__' has no attribute 'root'`。 这个错误发生在代码`root_dir = __init__.root`中。意思是:在模块`__init__`中找不到属性`root`。 根据错误信息,我们可以推断: 1. 代码中试图访问一个名为`__init__`的模块(可能是某个包的`__init__.py`文件)的`root`属性。 2. 但是该模块并没有定义`root`属性,因此引发`AttributeError`。 可能的原因: 1. 代码中确实有一个名为`__init__`的模块(可能是自定义的,也可能是第三方包的),但这个模块确实没有`root`属性。 2. 可能是由于命名冲突,导致`__init__`模块并不是我们期望的那个模块。例如,当前目录下可能有一个名为`__init__.py`的文件,而代码中又使用了`import __init__`,这样导入的实际上是当前目录下的`__init__`模块,而不是我们期望的某个包中的`__init__`模块。 解决方法: 1. 首先,检查代码中导入`__init__`模块的方式。通常,我们不建议直接导入名为`__init__`的模块,因为这样容易引起混淆。可能是想导入某个包的顶层模块,然后访问其`root`属性?例如,如果有一个包名为`mypackage`,那么应该这样导入: ```python import mypackage root_dir = mypackage.root ``` 而不是: ```python import mypackage.__init__ as init_module root_dir = init_module.root # 这样可能会出错,因为通常不会在__init__.py中定义root ``` 或者,更常见的是,在`mypackage/__init__.py`中定义`root`,然后通过包名直接访问: ```python import mypackage root_dir = mypackage.root ``` 2. 检查`__init__.py`文件: 如果确实需要在`__init__.py`文件中定义`root`,那么确保该文件中有类似这样的定义: ```python # 在mypackage/__init__.py中 root = "some/path" ``` 如果没有,请添加。或者,如果这个`root`是在包内的其他模块中定义的,则需要在`__init__.py`中显式导入,以便在包级别可见。例如: ```python # 在mypackage/__init__.py中 from .some_module import root ``` 3. 避免使用`import __init__`: 由于`__init__`是一个特殊的文件名,直接导入`__init__`模块容易导致混淆。通常,我们导入的是包名,而不是内部的`__init__`。所以,请检查代码中是否有类似这样的语句: ```python import __init__ # 不推荐 ``` 改为使用包名导入。 4. 检查当前目录是否存在`__init__.py`文件: 如果当前目录下有一个`__init__.py`文件,那么执行`import __init__`将会导入该文件。如果这个文件中没有`root`属性,就会报错。因此,请确保当前目录下没有不必要的`__init__.py`文件,或者将其重命名。 5. 如果错误发生在导入第三方库时,那么可能是该库的安装有问题,或者库的版本不兼容。尝试重新安装该库,或者查看库的文档和Issues。 6. 如果是在运行测试或者某个项目时出现,检查项目结构。例如,项目结构应该是: ``` my_project/ __init__.py # 这里定义root,或者从其他地方导入 main.py ... ``` 在`main.py`中,应该使用: ```python import my_project root_dir = my_project.root ``` 根据引用[^1]和[^3]中的错误,我们看到类似的问题(属性不存在)可能是由于环境配置或版本不匹配导致的。不过,当前错误与这些引用中的具体问题不同。引用[^1]是apex库的问题,引用[^3]是Windows下Anaconda的问题,而引用[^2]是关于mmdetection库的。因此,我们主要关注代码结构问题。 综上所述,请检查代码中导入`__init__`模块的部分,并确保在正确的`__init__.py`文件中定义了`root`属性。 如果问题仍然存在,请提供更多的代码上下文,以便更准确地定位问题。 相关问题: 1. 在Python中,如何正确使用`__init__.py`文件来定义包的属性? 2. 为什么直接导入`__init__`模块是不推荐的? 3. 如何避免Python中的模块命名冲突? 4. 当出现`AttributeError`时,有哪些常见的排查步骤? </think> ### 解决 `AttributeError: module '__init__' has no attribute 'root'` 的方法 此错误表明代码尝试访问 `__init__` 模块的 `root` 属性,但该属性未定义。以下是系统化的解决方案: #### 1. **检查模块结构** - 确保项目目录中存在 `__init__.py` 文件(可为空文件),用于标识目录为Python包。 - 在 `__init__.py` 中明确声明 `root` 属性: ```python # 在 __init__.py 中添加 root = "your/root/path" # 替换为实际路径 ``` #### 2. **修正导入语句** - **错误写法**: ```python import __init__ root_dir = __init__.root # 触发错误 ``` - **正确写法**: ```python from your_package import root # 通过包名导入 root_dir = root ``` 或 ```python import your_package root_dir = your_package.root ``` #### 3. **验证文件路径** - 确认 `__init__.py` 文件位置正确: ``` project/ ├── your_package/ │ ├── __init__.py # 此处定义 root │ └── module.py └── main.py # 从此处导入 ``` - 在 `main.py` 中应使用: ```python from your_package import root # 而非直接引用 __init__ ``` #### 4. **检查环境问题** - **清除缓存**:删除项目中的 `__pycache__` 目录和 `.pyc` 文件。 - **重新安装包**:若为第三方包,尝试重装: ```bash pip uninstall package_name pip install package_name ``` #### 5. **调试步骤** - 打印模块内容确认属性是否存在: ```python import __init__ print(dir(__init__)) # 检查输出是否包含 root ``` - 检查模块导入路径: ```python import sys print(sys.path) # 确保项目目录在路径中 ``` #### 典型场景示例 假设项目结构如下: ``` my_project/ ├── utils/ │ ├── __init__.py │ └── config.py └── main.py ``` 在 `config.py` 中定义: ```python root = "/project/data" ``` 需在 `utils/__init__.py` 中添加: ```python from .config import root # 显式导出属性 ``` 然后在 `main.py` 中正确导入: ```python from utils import root # 正确访问 ``` ### 根本原因分析 此错误通常由以下原因导致: 1. `__init__.py` 中未声明 `root` 属性 2. 使用 `import __init__` 而非包名导入 3. 文件路径错误导致Python未识别包结构 4. 环境残留缓存未更新[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值