关于python的引包 ,当我们的项目很大有很多子文件时候,或许会遇到导包问题,假如我们的项目树如下图
在 spider_test.py 编码
class Spiders(object):
@staticmethod
def print_data():
print('spiders')
我们在 class_models.py 编写代码 并运行 结果报错, 为什么 我们来看下
class ClassModels(object):
@staticmethod
def print_data():
print('models + 12345')
from spiders import spider_test
spider_test.Spiders.print_data()
/Users/ysl/.virtualenvs/develop_py3/bin/python3 /Users/ysl/media_spider_myself/test_path/models/class_models.py
Traceback (most recent call last):
File "/Users/ysl/media_spider_myself/test_path/models/class_models.py", line 27, in <module>
from spiders import spider_test
ModuleNotFoundError: No module named 'spiders'
我们在class_models.py 打印当前 sys.path 看下路径,可以看到当前文件下,解释器路径里面有两个路径 1 当前文件路径 2 项目根路径 。 也就说你可以从根目录引入 这样应该是没问题,我们试下
import sys
print(sys.path)
['/Users/ysl/media_spider_myself/test_path/models', '/Users/ysl/media_spider_myself', '/Users/ysl/.virtualenvs/develop_py3/lib/python36.zip', '/Users/ysl/.virtualenvs/develop_py3/lib/python3.6', '/Users/ysl/.virtualenvs/develop_py3/lib/python3.6/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Users/ysl/.virtualenvs/develop_py3/lib/python3.6/site-packages', '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend']
从上层目录引入 成功了
class ClassModels(object):
@staticmethod
def print_data():
print('models + 12345')
from test_path.spiders import spider_test
spider_test.Spiders.print_data()
# /Users/ysl/.virtualenvs/develop_py3/bin/python3 /Users/ysl/media_spider_myself/test_path/models/class_models.py
spiders
总结:在一文件下 ,解释器会加载两个路径,
- 当前文件路径
- 项目根路径
所以我们示例中的 class_models.py 引包的方式 有两种
- 第一种 根目录下分级引入
- 第二种 将当前文件路径添加到sys.path 路径中 见下文
import os
import sys
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
from spiders import spider_test
spider_test.Spiders.print_data()
print(sys.path)