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

Python项目跨包导入模块报错求助及函数调用疑问

Python模块导入问题解决及疑问解答

问题场景

项目结构:

-project
  -src
    -package1
      -script1.py
      -__init__.py
    -package2
      -script2.py
      -__init__.py
    -__init__.py

script1.py中的函数(注意你原代码里函数名的空格是语法错误,已修正):

def myfunct1():
    print("Hello")

def myfunct2():
    # do something
    pass

尝试在script2.py中导入调用时,写了如下代码:

from src.package1.script1 import *

funct1()  # 这里还犯了函数名写错的问题,应该是myfunct1

触发报错:

ModuleNotFoundError: No module named 'src'

导入错误的解决方法

方法1:相对导入

因为script2.py和package1同属src目录下,可用相对路径导入:

from ..package1.script1 import myfunct1

myfunct1()

⚠️ 注意:相对导入仅当脚本作为模块被其他代码导入时生效,直接运行script2.py会报错ValueError: attempted relative import beyond top-level package,此时建议用下面的方法。

方法2:手动添加项目根路径到Python搜索路径

在script2.py开头加入代码,把项目根目录(project文件夹)加入Python的模块搜索路径:

import sys
import os

# 从当前脚本路径向上回溯两级,找到project目录
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_root)

from src.package1.script1 import myfunct1

myfunct1()

这种方法不受运行位置限制,直接执行script2.py就能正常运行。

方法3:设置系统环境变量

在终端进入project文件夹,设置PYTHONPATH环境变量:

  • Linux/macOS:
export PYTHONPATH=$(pwd):$PYTHONPATH
  • Windows(命令提示符):
set PYTHONPATH=%cd%;%PYTHONPATH%
  • Windows(PowerShell):
$env:PYTHONPATH = "$(Get-Location);$env:PYTHONPATH"

设置完成后,直接用你原本的导入逻辑即可(记得修正函数名):

from src.package1.script1 import myfunct1

myfunct1()

关于函数调用的疑问

解决导入错误后:

  1. 直接调用myfunct1()是可以执行的,但如果直接运行script2.py,代码会立刻执行;如果script2.py被其他脚本导入,myfunct1()也会在导入阶段自动运行。
  2. 推荐用main函数包裹执行代码,这是Python的最佳实践,避免脚本被导入时误执行逻辑:
# 导入语句...

if __name__ == "__main__":
    myfunct1()

这样只有当直接运行script2.py时,myfunct1()才会执行;作为模块被导入时不会触发调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:15:27