Python PyCharm 运行,取不到 .env 文件中的值

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

以脚本方式运行: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.pyrun.py),并且不依赖包内相对导入,直接用 python main.py 更简洁。

uv run 前加上是确保使用项目虚拟环境,不影响上述区别。两者本质上都是启动 Python,但上下文不同,根据代码组织方式选择即可。

posted @ 2026-08-04 11:56  VipSoft  阅读(3)  评论(0)    收藏  举报