PythonImport
Python相对引用详解
起因
受害者视角
假设有这样一个项目结构: 1
2
3
4
5project/
├── main.py
└── sub/
├── __init__.py
└── sub.pymain.py
中,我们希望导入sub
模块,并调用sub
模块中的函数。我们可能会尝试以下代码:
1
2import sub.sub
sub.sub.func()
项目结构变成了这样 1
2
3
4
5
6
7project_NB/
├── main1.py
└── project
├── main.py
└── sub/
├── __init__.py
└── sub.pymain1.py
中,我们希望导入project
模块中的main.py
,并调用sub
模块中的函数。我们可能会尝试以下代码:
1
2from sub.main import func
func()
问题出在了哪儿?
在修改前后分别加上print(os.getcwd())
,
发现原来先前工作目录和命令行的环境目录相同,
因此导入sub包时可以使用顶层文件夹的导入方式, 而在修改后,
命令行环境目录为project_NB
,
而工作目录为project_NB/project
,
因此无法找到sub
包.
解决方案
既然问题是工作目录的问题,
那么我们只需要把工作目录修改为顶层文件夹即可 1
2import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
寄.
为啥?
原来是少些了一行, 没有设置sys中的路径变量 1
2
3
4
5import sys
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
搞定
抬杠
那这时候就有人要问了, 改完之后我还要在顶层文件夹下运行代码呢, 这不是拆东墙补西墙吗?
你傻啊?找个变量暂存一下初始的, 引用完改回来不就得了
1 | os1 = os.getcwd() |
demo请参阅 LegendWechatBot