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()
关于函数调用的疑问
解决导入错误后:
- 直接调用
myfunct1()是可以执行的,但如果直接运行script2.py,代码会立刻执行;如果script2.py被其他脚本导入,myfunct1()也会在导入阶段自动运行。 - 推荐用
main函数包裹执行代码,这是Python的最佳实践,避免脚本被导入时误执行逻辑:
# 导入语句... if __name__ == "__main__": myfunct1()
这样只有当直接运行script2.py时,myfunct1()才会执行;作为模块被导入时不会触发调用。
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

