Python项目中无法导入自建模块包的问题!
相信初心们很多都会遇到这样的问题。
自建模块放在项目中的公用模块包中,开发工具(pycharm或vscode等等)里面完美运行,上线或者在shell命令中却运行报错,找不到模块:
ModuleNotFoundError: No module named 'xxxx'
遇到这个错误的时候,我也曾非常苦恼 ...
各种度娘 .....
多数方法基本无效...(也可能我太笨,或太背...)
在经历了2个半小时的挫折之后,决定自己解决...
在此分享一下个人解决方案。
一、项目结构
我的项目结构是这样的:
spider02:为项目根目录路径
spiders:为爬虫项目包,其下分N种爬虫。
_tools包:就是我们所有爬虫公用的工具包了
二、导包方法
那么问题来了。我们该如何倒这个自建的工具包呢?
我们都知道,倒包常用方式分两种:
-
以当前路径为准,输入目标模块 或 包的路径:
from .._tools import xxx
-
以项目根目录为准,输入目标模块 或 包的路径:
from spiders._tools import xxx
个人建议使用第二种方法。所以,我们的导包需要这样倒:
from spider._tools import *
这样的好处就是,一切都以项目根目录为开始,比较统一,不容易出错。
设置(最终)
说完了导包,我们最后就来说该怎么设置这个自建的模块包呢。
如果光有__init__.py文件的话,也只能说明他是一个可导的文件包。
如果你直接导入它的话,就会报错。因为,import需要搜索系统环境变量,来确定所导包的位置。如果找不到,当然会报错 ...
直奔主题....
Mac系统的环境变量:
在下列文件中,添加你的项目绝对路径:
/etc/profile
/etc/paths
个人建议添加到第二个里面。
如果说你不想改变系统的,那么把项目绝对路径添加到私人环境变量中也ok:
/private/etc/paths
这是用户私人的全局,只要打开电脑,登陆后,就会加载。
有人会说,你直接append不就行了么。
为想说的是;;;;
如果直接append的话,你就需要把
【每个用到tools模块包,或是自建包下面的文件导其他自建包模块的时候,要在所有py文件中,都去写一遍append...】
好了,就写这么多....上班时候写的...见谅。
补充一句,任何项目中导包地方,都是以项目根目录为准的。