背景:自己封装了一个package,并且含有多个子package,每个子package下有多个不同的Moudle,然后再引用Moudle时,在pycharm中运行没有问题,但是将这个文件夹放在linux环境下时,出现了错误:ModuleNotFoundError: No module named 'package' 。
结构如下:
package:
├─ sub_package0
│ ├─ __init__.py
│ ├─ utils.py
│ └─ www.py
├─ sub_package1
│ ├─ __init__.py
│ ├─ utils1.py
│ └─ www1.py
....
├─ __init__.py
├─ abc.py
└─ xyz.py
网上百度后,主要试了两种方法:
(1)一种是在linux环境的.bashrc中添加环境变量PYTHONPATH,参考:http://blog.sina.com.cn/s/blog_9b1b494a0102vrl3.html
(2)在每个Moudule中通过sys模块来添加路径,参考:https://www.cnblogs.com/dreamyu/p/7889959.html
第一种方法试了之后发现还是报上述错误,而第二种方法由于在每个module中都要添加,所以太麻烦了。为了省去麻烦,直接将package放入anaconda3的安装路径anaconda3/lib/python3.6/site-packages下,该问题得到解决,而site-packages库其实就是pip install安装的package和module的存储位置。
附——补充知识
module:模块,一个.py文件可以被称为一个module,使用模块可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,但是也要注意,尽量不要与内置函数名字冲突。
package:包,按目录来组织不同的module,类似于文件夹的作用,通过包来组织模块,避免冲突。引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。请注意,每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块,而它的模块名就是其包名。