Python PyCharm 运行,取不到 .env 文件中的值
PyCharm 以模块的方式运行
要读取 .env 变更,需要在 Paths to ".env" files 后面指定变更文件的路径,或者如图,以项目根目录运行

以脚本方式运行:uv run app/worker.py
以模块方式运行:uv run -m app.worker
这两个命令都用于在 uv 管理的虚拟环境中执行 Python 代码,但它们的运行方式和上下文有本质区别:
1. uv run python -m app.worker
- 以模块方式运行:通过
-m参数将app.worker当作一个模块来执行(即app/worker.py)。 - 包上下文:Python 会正确识别
app作为包,因此模块内的相对导入(如from . import xxx)会正常工作。 sys.path行为:当前工作目录会被添加到sys.path,但模块的__package__和__name__会被设置为app.worker和__main__,符合包结构。- 适用场景:适合执行包内的子模块(如 Celery worker、后台任务),尤其当项目依赖包内其他模块时。
2. uv run python main.py
- 以脚本方式运行:直接执行
main.py文件。 - 无包上下文:脚本所在的目录会被添加到
sys.path,但__package__通常为None,相对导入会失败(除非显式处理)。 - 独立性:适合作为入口点的顶层脚本(如 Flask/Django 启动文件),不依赖包结构。
关键区别总结
| 特性 | python -m app.worker |
python main.py |
|---|---|---|
| 运行方式 | 模块(包内) | 脚本(文件) |
| 相对导入支持 | ✅ 支持 | ❌ 不支持(除非包已安装) |
__package__ 设置 |
设为 app |
通常为 None |
| 适用场景 | 包内子模块、任务、后台进程 | 顶层入口程序、单文件脚本 |
如何选择?
- 如果
app.worker是一个包内的模块,并且它需要导入同一包下的其他模块(如from . import utils),必须使用python -m app.worker,否则会报ImportError。 - 如果
main.py是项目根目录下的独立启动脚本(例如app.py或run.py),并且不依赖包内相对导入,直接用python main.py更简洁。
在 uv run 前加上是确保使用项目虚拟环境,不影响上述区别。两者本质上都是启动 Python,但上下文不同,根据代码组织方式选择即可。
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/22203848
浙公网安备 33010602011771号