Python跨目录模块调用的实现:绝对路径与sys.path配置详解

苏见山
苏见山
发布时间:2026-10-13 | 6人浏览过
原创

本文详解Python中不同目录间模块调用的实现方法。通过解析__file__、os.path.abspath()及sys.path等关键概念,对比绝对路径与相对路径的区别。重点演示如何获取项目根目录绝对路径并追加至sys.path环境变量,从而解决跨层级模块导入时的路径依赖问题,确保代码在不同执行环境下的可移植性。

一、背景

此前在《软件开发目录规范》一文中,我们探讨了遵循统一目录结构对代码可读性的重要性。若缺乏规范,即便逻辑简单的程序也会变得晦涩难懂,极大消耗阅读与维护时间。然而,一旦确立了规范的目录结构,如何优雅地实现模块间的相互导入便成为关键问题。这引出了本文讨论的两个核心概念:绝对路径与相对路径。

二、函数功能解释

1、__file__

功能:返回当前脚本文件的相对路径。

#atm.py中的代码
print(__file__)
 
#pycharm的执行结果
D:\Python\Python35\python.exe D:/PycharmProjects/51homework/Atm/bin/atm.py
D:/PycharmProjects/51homework/Atm/bin/atm.py #打印出绝对路径
#从cmd执行atm.py 
D:\PycharmProjects\51homework>python Atm/bin/atm.py 
Atm/bin/atm.py  #打印的是相对路径 

观察上述示例可知,在PyCharm中执行时输出的是绝对路径,而在CMD命令行中调用Python命令时显示的却是相对路径。这是因为PyCharm是从绝对路径下启动atm.py文件的,而CMD执行时取决于当前工作目录。__file__变量反映的是相对于当前执行路径的位置,因此在不同路径下执行会打印出对应的路径结果。

2、os.path.abspath()

功能:返回当前文件的绝对路径。

#atm.py的文件代码
import os
print(os.path.abspath(__file__))
#在cmd中的执行结果
D:\PycharmProjects\51homework>python Atm/bin/atm.py
D:\PycharmProjects\51homework\Atm\bin\atm.py #获取atm.py的绝对路径 

3、os.path.dirname()

功能:提取目录名称,不包含文件名。

print(os.path.dirname( os.path.abspath(__file__) ))
D:\PycharmProjects\51homework\Atm\bin #只返回目录名,不需要文件名 

4、sys.path

功能:获取Python解释器搜索模块的环境变量列表。

import sys
print(sys.path)
#cmd执行的结果
['D:\\PycharmProjects\\51homework\\Atm\\bin', 'D:\\Python\\Python35\\python35.zip',
 'D:\\Python\\Python35\\DLLs', 'D:\\Python\\Python35\\lib', 'D:\\Python\\Python35', 
'D:\\Python\\Python35\\lib\\site-packages'] 

注:sys.path以列表形式打印,因此其数据类型为列表。

三、绝对路径和相对路径

1、绝对路径

定义:从文件系统的根目录开始,直至目标目录的完整路径。

>>> import os
>>> os.chdir("D:\\PycharmProjects\\51homework\\Atm\\bin\\")
>>> os.listdir()
['atm.py', '__init__.py']
>>> os.path.abspath('atm.py')
'D:\\PycharmProjects\\51homework\\Atm\\bin\\atm.py'  #是从D盘的这个根目录下来的 

2、相对路径

定义:以当前目录为起点,到达目标目录的路径。

>>> import os

>>> os.chdir("D:\\PycharmProjects\\51homework\\Atm\\bin\\")

>>> os.listdir()

['atm.py', '__init__.py']

>>> os.path.dirname('atm.py')

''  #显示相对路径

四、不同目录间进行模块调用

1、添加环境变量

在实际开发中,绝对路径与相对路径函数通常结合使用,特别是在处理不同目录间模块相互调用的场景。

例如,按照上述目录层级结构,若atm.py希望调用其他模块的代码,默认情况下必须保证两者处于同级目录。否则,直接导入会失败,具体表现如下代码所示:

#atm.py中的代码

import sys

print(sys.path)

#cmd执行的结果

D:\PycharmProjects\51homework>python Atm/bin/atm.py

['D:\\PycharmProjects\\51homework\\Atm\\bin', 'D:\\Python\\Python35\\python35.zip',

 'D:\\Python\\Python35\\DLLs', 'D:\\Python\\Python35\\lib', 'D:\\Python\\Python35', 

'D:\\Python\\Python35\\lib\\site-packages']

此时只能定位到'D:\\PycharmProjects\\51homework\\Atm\\bin'这一层级,无法访问其他层级的模块。该如何解决这一问题?

解决步骤如下:

1. 获取Atm项目根目录的绝对路径 2. 将该路径添加到系统环境变量中

具体实现代码如下:

#atm.py中的代码
import os,sys
BASE_DIR = os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) #Atm的绝对路径
print(BASE_DIR)
sys.path.append(BASE_DIR) #添加到环境变量中
#cmd执行结果
D:\PycharmProjects\51homework>python Atm/bin/atm.py  #执行atm.py文件
D:\PycharmProjects\51homework\Atm  #打印Atm的绝对路径
['D:\\PycharmProjects\\51homework\\Atm\\bin', 'D:\\Python\\Python35\\python35.zip', 
'D:\\Python\\Python35\\DLLs', 'D:\\Python\\Python35\\lib', 'D:\\Python\\Python35',
 'D:\\Python\\Python35\\lib\\site-packages',
 'D:\\PycharmProjects\\51homework\\Atm']  #Atm的绝对路径已经添加到环境变量中 

2、调用其他模块

完成上述配置后,即可顺利实现不同目录下模块之间的相互调用。

#atm.py中的代码
import os,sys
BASE_DIR = os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) )
sys.path.append(BASE_DIR)
from core import main  #调用core中的main模块
main.sayhi()  #调用main模块中sayhi函数
 
#main.py中代码
def sayhi():
  print("hello word")
 
#cmd执行的结果
D:\PycharmProjects\51homework>python Atm/bin/atm.py
hello word

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表