python项目入口文件习惯叫main.py,因它是社区约定俗成的命名,保障协作一致性、工具链识别(如poetry/ci脚本)及新人直觉启动;虽非语言强制,但忽略易致“找不到起点”。

激活 venv 后直接运行 main.py 或其他入口文件
只要虚拟环境已成功激活,python 命令就指向该环境里的解释器,此时运行项目入口文件(如 main.py、app.py)和在系统全局 Python 下运行是完全不同的——它只会加载 .venv/lib/pythonX.Y/site-packages/ 里的包,不会误用系统或其它项目的依赖。
常见错误现象:ModuleNotFoundError: No module named 'requests',即使你记得装过,但其实是在没激活时用系统 pip 装的;或者反过来,激活后却报 ImportError,是因为当前目录不在 Python 模块搜索路径里。
- 确保你在项目根目录下执行命令(即
.venv文件夹和main.py在同一级) - 直接运行:
python main.py(不要加./或完整路径,除非有特殊导入逻辑) - 如果入口文件在
src/下,且项目结构含src/__init__.py,推荐加-m参数运行模块:python -m src.main - 避免用
./main.py这种写法——它可能绕过当前 shell 的PYTHONPATH和虚拟环境配置,尤其在 Linux/macOS 上容易出错
python -m 和直接 python xxx.py 的区别在哪
本质差异在于 Python 解释器如何确定 __name__、__file__ 和模块搜索路径(sys.path)。直接执行脚本时,当前目录自动加入 sys.path[0];而用 -m 方式,Python 会按模块方式解析路径,更符合包内相对导入规范。
典型场景:你的项目结构是
Python venv 3.14.2 使用 Python 3.14.2 Windows 64 位官方安装包,安装 Python 后即可使用标准库 venv 创建虚拟环境。
myproject/ ├── .venv/ ├── src/ │ ├── __init__.py │ └── main.py └── requirements.txt
这时:
-
cd src && python main.py:能跑,但from .utils import helper会报SystemError: Parent module '' not loaded -
python -m src.main(在myproject/目录下执行):正确加载src为包,支持所有相对导入
Windows PowerShell 激活后仍提示“无法加载脚本”导致运行失败
这不是运行 main.py 的问题,而是激活环节没真正生效——PowerShell 默认策略禁止执行本地脚本,所以 .venv\Scripts\Activate.ps1 被拦住,看起来像“激活了”,实则 python 还指向系统路径。
验证方法:运行 where python(Windows)或 which python(macOS/Linux),输出必须包含 .venv 路径。否则即使提示符显示 (.venv),也可能是假激活。
- 临时解决:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser(仅对当前用户生效) - 更稳妥的做法:改用 CMD 运行
.venv\Scripts\activate.bat,它不受 PowerShell 策略限制 - VSCode 用户注意:终端自动激活可能失效,建议在集成终端中手动执行
source .venv/bin/activate(macOS/Linux)或.venv\Scripts\activate(CMD)再运行
为什么有时 python main.py 报错说找不到模块,但 pip list 明明显示已安装
最常见原因是当前工作目录不对,或项目未被识别为 Python 包。venv 只管解释器和包路径,不管你的代码怎么组织。
- 检查
pip list输出是否真包含你要的包(比如flask而不是flask-sqlalchemy) - 确认
main.py所在目录没有同名的.py文件干扰导入(例如存在requests.py会导致import requests导入自己) - 如果用了相对导入(如
from ..config import settings),必须用python -m启动,且确保上级目录有__init__.py - 某些 IDE(如 PyCharm)会默认把项目根加进
PYTHONPATH,但命令行不会——别依赖 IDE 行为来调试命令行启动逻辑
python 和 pip 命令就位,不代表你的代码结构天然兼容这个环境**。路径、包声明、导入方式,三者必须对齐,缺一不可。










