You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python -m模块运行相对路径错误排查及执行路径原理咨询

Python包执行路径问题与解决方案

我希望通过命令 (.venv) C:\Users\trg\Escritorio\project1> python -m src.project1.__main__ 运行project1包,同时彻底理解Python执行路径的工作机制。具体疑问如下:

  1. 为何该命令在PyCharm中可正常运行,但在CMD中失败?
  2. 如何规范组织和导入模块,使-m参数在IDE与终端中解析路径保持一致?

项目简化结构

project1/
   |   requirements.txt
   \---.venv
   \---src
      |   __init__.py
      +---project1
      |   |   log.log
      |   |   NOTICE
      |   |   _converter.py
      |   |   _files_manager.py
      |   |   _project1.py
      |   |   _returning.py
      |   |   __init__.py
      |   |   __main__.py
      |   |   
      |   +---database
      |   |       config.db
      |   |       log.log
      |   |       _db.py
      |   |       __init__.py
      |   |       
      |   +---interface
      |   |   |   _interface.py
      |   |   |   _lang.py # 此处触发错误

出错代码片段(project1/src/project1/interface/_lang.py)

from PySide6.QtCore import Qt, QTranslator, QLocale
from PySide6.QtWidgets import QApplication
from .ui_dialog_language import Ui_Lang_Dialog
from PySide6.QtWidgets import QDialog
from sqlazo import Database

# 采用相对于__main__.py的相对路径,PyCharm中可运行
db = Database('./database/config.db', False)

# 其他代码...

完整错误栈

(.venv) C:\Users\trg\Escritorio\project1>python -m src.PYMD.__main__
←[33mVisite esta página (https://tutosrive.github.io/chromologger/) antes de ejecutar este módulo←[0m
←[31mRevise el archivo "log" que se encuentra en esta ruta: C:\Users\trg\Escritorio\project1\.venv\Lib\site-packages\chromologger\log.log←[0m
←[31mRevise el archivo "log" que se encuentra en esta ruta: C:\Users\trg\Escritorio\project1\.venv\Lib\site-packages\chromologger\log.log←[0m
←[34mRevise C:\Users\trg\Escritorio\project1\log.log para ver los registros.←[0m
Traceback (most recent call last):
  File "<frozen runpy>", line 189, in _run_module_as_main
  File "<frozen runpy>", line 112, in _get_module_details
  File "C:\Users\trg\Escritorio\project1\src\project1\__init__.py", line 3, in <module>
    from .project1 import run_app
  File "C:\Users\trg\Escritorio\project1\src\project1\_project1.py", line 4, in <module>
    from .interface import run
  File "C:\Users\santi\Escritorio\project1\src\project1\interface\__init__.py", line 1, in <module>
    from ._initialHelp import InitialHelp
  File "C:\Users\trg\Escritorio\project1\src\project1\interface\_initialHelp.py", line 3, in <module>
    from ._lang import LanguageManager
  File "C:\Users\trg\Escritorio\project1\src\project1\interface\_lang.py", line 7, in <module>
    db = Database('./database/config.db', False)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\trg\Escritorio\project1\.venv\Lib\site-packages\sqlazo\sqlazo.py", line 37, in __init__
    self.cur:sql.Cursor = self.__cursor()
                          ^^^^^^^^^^^^^^^
  File "C:\Users\trg\Escritorio\project1\.venv\Lib\site-packages\sqlazo\sqlazo.py", line 62, in __cursor
    return self.conn.cursor()
           ^^^^^^^^^^^^^^^^
AttributeError: 'int' object has no attribute 'cursor'

我已在项目内不同路径执行python -m src.project1.__main__命令,但均出现上述错误,期望程序界面能像在PyCharm中一样正常启动。


问题解答

1. 为何PyCharm可运行,CMD中失败?

核心原因是当前工作目录(CWD)的差异:

  • PyCharm默认将包的根目录(src/project1/)设为工作目录,此时代码中./database/config.db会被解析为src/project1/database/config.db,能正确找到数据库文件。
  • 终端中执行python -m src.project1.__main__时,工作目录是你执行命令的位置(project1/),此时./database/config.db会指向project1/database/config.db——这个路径不存在,导致sqlazo库连接失败,返回错误码(int类型),后续调用cursor()方法时就会触发AttributeError。

2. 如何规范组织模块,使-m参数在IDE与终端中路径一致?

要彻底解决问题,需基于包的绝对路径定位资源文件,而非依赖当前工作目录。具体操作如下:

步骤1:定义包的根路径

在src/project1/__init__.py中添加代码,获取包的绝对根目录:

import os

# 获取当前包的绝对根目录(即src/project1/)
PACKAGE_ROOT = os.path.dirname(os.path.abspath(__file__))

步骤2:使用绝对路径访问资源

修改_lang.py中的数据库初始化代码,用绝对路径替代相对路径:

from PySide6.QtCore import Qt, QTranslator, QLocale
from PySide6.QtWidgets import QApplication
from .ui_dialog_language import Ui_Lang_Dialog
from PySide6.QtWidgets import QDialog
from sqlazo import Database
from .. import PACKAGE_ROOT  # 从上级包导入根路径常量
import os

# 构建数据库的绝对路径
db_path = os.path.join(PACKAGE_ROOT, 'database', 'config.db')
db = Database(db_path, False)

# 其他代码...

步骤3:统一IDE与终端的工作目录(可选)

  • 在PyCharm中,进入Run/Debug Configurations,将Working directory设置为项目根目录(project1/),和终端执行命令的目录保持一致。
  • 终端中始终在project1/目录下执行python -m src.project1.__main__,不要切换到其他子目录。

步骤4:规范模块导入方式

所有内部模块导入优先使用相对导入(如from . import xxx或from .. import xxx)。如果需要让src目录被Python识别为模块搜索路径,可在项目根目录执行:

# Windows终端
set PYTHONPATH=%cd%\src
# Linux/macOS终端
export PYTHONPATH=$(pwd)/src

内容的提问来源于stack exchange,提问作者Tutos Rive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:22:35