PyPI上传的pyutils39包安装后调用函数报AttributeError求助
问题原因
你遇到的AttributeError本质是Python包的导出规则问题,结合你的配置,具体有两个错误点:
- 你在
setup.py中配置了packages=setuptools.find_packages(where="src"),说明打包的是目录形式的Python包;但你的函数都写在包内的pyutils39.py子模块里,没有在包的__init__.py中导出这些函数,默认导入顶层pyutils39包时,不会自动加载子模块的内容,所以找不到对应属性。 setup.py中的py_modules=['/src/pyutils39/pyutils39.py']配置完全错误:路径以斜杠开头是绝对路径写法,不能用在这里;且py_modules是用于声明独立单文件模块的配置,和你用的packages配置冲突,属于冗余配置。
修复步骤
1. 确认项目目录结构
你的本地项目目录需要符合以下结构,缺失的__init__.py要新建:
项目根目录/ ├── src/ │ └── pyutils39/ │ ├── __init__.py # 初始为空即可,后续要加导出代码 │ └── pyutils39.py # 你写了reverse、consoleask函数的主文件 ├── README.md └── setup.py
2. 清理冗余错误配置
删除setup.py中的这一行:
py_modules=['/src/pyutils39/pyutils39.py'],
3. 配置包导出规则
在src/pyutils39/__init__.py中添加以下代码,将需要对外暴露的函数导出到顶层包:
from .pyutils39 import reverse, consoleask
如果你不想保留子模块层级,也可以直接把两个函数的代码放到__init__.py里,效果完全一致。
4. 重新发布验证
修改setup.py中的版本号(比如升级到0.1.4),重新打包上传到PyPI即可。安装新版本后你的测试代码就能正常运行。
额外说明
你把pyutils39.py放到测试文件同目录时运行正常,是因为此时导入的是单文件模块,而非目录形式的包,不需要走__init__.py导出规则,所以能直接调用函数。
内容的提问来源于stack exchange,提问作者Enderbyte09
相关产品推荐
相关产品推荐

