【python项目中的导包路径问题】

文章详细阐述了Python中模块之间的引用路径问题,包括当前路径、工作路径和导包路径的区别。当不同目录的模块互相引用时,可能导致找不到模块的错误。解决方案包括使用sys.path动态添加模块路径,确保导入语句的正确性。文章提到了一种在file2.py中添加其所在目录到sys.path的方法,以解决不同入口文件运行时的导入问题。

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当前路径和导包路径问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值