问题描述:
项目在本地环境运行时,无报错。
但将项目提交至服务器运行时,出现ModuleNotFoundError:No module named 'packageA '错误。
项目场景:
python文件中引用了同文件夹下的另一个python文件作为模块
下面用一个简单的例子做个复盘,项目结构如下:
- ProjectName
- packageA
- a.py
- b.py
- packageA
a.py如下:
from packageA import b
b.show()
b.py如下:
def show():
print("this is b")
原因分析:
Python解释器在搜索路径中没有找到相应名称的模块,其中搜索路径是一个解释器会先进行搜索的所有目录的列表。
尝试1:
在packageA目录下创建__init__.py文件,此文件可以使得Python将packageA视为一个包而不是文件夹。
- ProjectName
- packageA
- a.py
- b.py
- init.py
- packageA
但添加此文件后服务器上运行依然报同样的错,无效。
尝试2:
Python的搜索路径存放在sys模块的path中,因此尝试将要引入模块的目录添加至sys.path。
于是我新建一个py文件,运行以下代码:
import sys
sys.path.append("xxx/xxx/packageA") #具体路径根据自己的项目结构进行修改
print("sys.path")
运行完成后,在输出结果中看到了模块所在目录,转头运行a.py却依然报同样的错误。
这让我非常纳闷,明明模块所在目录已经添加至搜索路径sys.path,为什么还是不行呢?
后面我在某篇文章中发现这种方法导入的路径会在 Python 程序退出后失效。
因此,需要将上面的代码放入运行文件的顶端,这样每次运行都会添加目录至sys.path。
最后a.py修改如下:
import sys
sys.path.append("xxx/xxx/packageA") #具体路径根据自己的项目结构进行修改
from packageA import b
b.show()
修改完成后,成功在服务器上运行。