python项目中模块之间的引用路径问题
module: 模块,就是python中.py结尾的文件
包:就是一个文件夹,里面可以放模块和子包,通常有__init__.py文件
当前路径:可以通过os.getcwd()获得,指的是Linux命令行中使用pwd获得路径,这个路径也会被加入到PYTHONPATH即sys.path中。这个路径也会影响在python中打开文件时填写的路径。在python中打开文件时若选择使用相对路径,则是相对于此路径。
import os
current_dir = os.getcwd()
工作路径:是指当前正在执行的python文件所在的路径,通过以下方式获得。这个与python的导包有关联
import os
work_dir = os.path.dirname(os.path.abspath(__file__))
导包路径:指python解释器会从哪些路径导入包,通过sys.path查看
import sys
for p in sys.path:
print(p) #导包路径是个列表,有很多路径可以导包
工作路径是导包路径的首要路径,即如以当前A.py文件作为程序入口运行代码时,当前A.py所在的目录路径就会被添加到PYTHONPATH(这里面存放的是Python可以从哪里导包的信息,即sys.path的内容)中。但是,如果在A.py中引用了其他不同目录下的模块,其他目录下的模块有引用了另外的目录中的模块,这是可能会提示找不到模块的错误。如下例子:
有如下目录结构:
.
—dirA
—file1.py
—file2.py
—dirB
—main.py
假设在main.py中引用了file1.py和file2.py,在file2.py中引用了file1.py
此时以main.py运行当前程序,此时main.py所在的目录(也就是工作路径)dirB会被添加到导包路径中,
但是当解释器运行到main.py中调用file1和file2的地方时,
会按照写import的顺序先跳到file1.py,由于file1.py中没有模块调用,
因此返回然后跳到file2.py中,此时file2.py所在的目录dirA就是工作目录,
但是系统并不会将dirA添加到导包路径中,如果此时在file2.py中使用的是import file1来导入file1块,系统就会报错,提示找不到模块,
因为此时系统只会去搜索dirB/下有没有file1.py,并不会去dirA/下去寻找。
此时如果想让程序正常运行的话,应使用import dirA.file1 来导入file1模块。
但是此时如果直接运行file2.py的话,系统也会报错,
因为此时file2.py的工作路径dirA会被加入到导包路径中,
这里还用import dirA.file1 来导入file1模块的话,
会提示找不到模块,因为系统在dirA/下找不到dirA/file1.py,
即搜索路径为dirA/dirA/file1.py,只能找到file1.py。
那么该如何让两个程序都能顺利运行,而又不将import的路径改来改去呢?
一种想法是将file2的工作目录添加到导包路径中,此时可在file2.py中加上如下代码:
current_directory = os.path.dirname(os.path.abspath(__file__))
root_directory = os.path.abspath(os.path.join(current_directory,'.'))
sys.path.append(root_directory)
并且使用import file1来导入file1模块
使用以上方法,无论是以main.py还是file2.py为入口程序来运行代码,都不会报错。
这个方法也很累赘,写起来也不简洁。模块之间的导包虽然很麻烦,但是只要记得用
sys.path来查看当前文件的导包路径就可以了
当解释器运行到当前文件的import处,
就会将import的内容拼接到sys.path中的路径后面去寻找包或者模块,找不到的时候就会报错。
文章详细阐述了Python中模块之间的引用路径问题,包括当前路径、工作路径和导包路径的区别。当不同目录的模块互相引用时,可能导致找不到模块的错误。解决方案包括使用sys.path动态添加模块路径,确保导入语句的正确性。文章提到了一种在file2.py中添加其所在目录到sys.path的方法,以解决不同入口文件运行时的导入问题。
775

被折叠的 条评论
为什么被折叠?



