Python 导入自定义包的正确做法是什么?

ztm0929 · 2024-8-21 18:41:41 · 187 次点击
我是编程新手,正在练习爬虫项目,Python 到底如何导入包?
```
xxx_project
├── README
└── app
    ├── models.py
    ├── main.py
    └── crawler
        └── scraper_1.py
        └── scraper_2.py
        └── scraper_3.py
```  
models 定义了数据库引擎和会话,我想让 scraper 能够与数据库交互,但是  
`from ..models import func` 会得到报错  
`ImportError: attempted relative import with no known parent package`  


`from app.models import func` 又会得到报错  
`ModuleNotFoundError: No module named 'app'`  

网上提到的在 app 目录下创建空白 `__init__.py` 似乎也没有效果,而 GPT 提到的将 app 目录添加到环境变量是最佳做法吗?还是说我这样的目录结构本身就是错的?
举报· 187 次点击
登录 注册 站外分享
16 条回复  
Maerd 小成 2024-8-22 17:29:17
楼上的很多都没说到点上,如果你是 pycharm ,可以不用配置,如果你是 vscode,需要将 PYTHONPATH 设为源代码根目录
houzhiqiang 小成 2024-8-22 14:00:01
根本原因是你要找到你的程序入口
EndlessMemory 小成 2024-8-22 10:14:08
添加当前路径到环境变量
sujin190 小成 2024-8-22 09:03:46
有__init__.py 文件的文件夹才是 python 的 package ,否则就是一个普通文件夹,而且如果你的 scraper 是个包含 main 的执行程序,此时是不能导入 models 的,因为不在 package 导入路径里,python import 的是 package 不是目录或者文件
kanchi240 小成 2024-8-21 23:55:59
https://docs.python.org/3/tutorial/modules.html#intra-package-references
Since the name of the main module is always "__main__", modules intended for use as the main module of a Python application must always use absolute imports.
y1y1 初学 2024-8-21 22:44:57
import 的根目录是入口文件的
Sawyerhou 小成 2024-8-21 22:13:02
楼上几层的观点+1 ,

现有目录结构可以试试
from models import func

如果想从 app 导入,就要 append 路径到 sys ,
不然 main 函数找不到 app
NickLuan 小成 2024-8-21 21:45:55
总结的到位👍
@cnt2ex
chenqh 小成 2024-8-21 21:39:58
你把 main 移到 app 同层,就可以 from app.models import func
forQ 小成 2024-8-21 21:18:49
sys.path.append()

sys.path.insert()
12下一页
返回顶部