文章目录
前言
最近在写毕设的代码,在导入一个自己写的库文件的时候出现了路径问题。因为之前写其他项目的时候遇到过这个问题,这次又遇到了,并且用了解决之前项目的方法来解决这次的问题,但是并没有成功并且出现了新的问题,所以记录一下这次的问题解决过程。
一、问题描述
导入自己写的python库文件的时候出现ModuleNotFoundError
,有的时候上一次运行就可以,但是下一次运行就找不到库
二、问题分析和解决方法
我自己写的库文件都放在utils
目录下,结构如下图:
此时我想在preprocess.py
中导入common.py
中的方法
from common import read_image, stopwords_list, clean_str_sst, get_text_data, add_unknown_words, get_W, word2vec
但是报路径错误,找不到我要的文件
ModuleNotFoundError: No module named 'common'
这个找不到库的问题我之前在写其他项目的时候出现过,之前出现这个问题是因为我在从另一台机器上复制项目文件夹到我自己的电脑上的时候把pycharm创建工作目录时自动生成的.idea
文件夹也给复制过去了,这个时候用pycharm打开那个文件夹,大概率会出现一些路径问题。这是因为原本pycharm自动帮你处理好的配置也被复制过去了,而复制过去的那个项目虽然里面的目录结构,代码内容都一样,但是他的路径变了,所以在新目录下import当前目录下的一些库的时候他会找不到。
常见的解决方法有很多,如果pycharm里面出现这个错误的话可以直接通过将文件标记为source root
来解决,不过这种方式比较暴力,并且在非IDE的环境下是没有用的,比如服务器环境下。
如果是在服务器上出现路径报错问题的话,一般是使用sys.path.append
方法将要导入的库文件的目录路径加入到系统的环境变量里面,我个人的话比较推荐这种方式,比如我这边要将.utils
加入我的搜索路径环境变量里面可以这样做:
import sys
sys.path.append('../utils')
from common import read_image, stopwords_list, clean_str_sst, get_text_data, add_unknown_words, get_W, word2vec
记住一定要在导入库之前将路径加到环境变量里面。
大多数情况这样就可以解决98%的问题了,但是我用了这招之后还是报错,此时我打印了我的path的环境变量
这里显示../utils
已经被加入到环境变量里面去了。于是我又上stackoverflow上面找了一下解决方法,找到了下面的方法:
import sys
current_dir = os.path.dirname(__file__)
sys.path.append(current_dir)
from common import read_image, stopwords_list, clean_str_sst, get_text_data, add_unknown_words, get_W, word2vec
重新运行之后,就可以找到了。
但是因为这个问题屡次遇到并且在上一次遇到的时候被弄得很头疼于是我仔细研究了一下,发现这个依赖问题和pycharm的工作路径有关,因为我是在MyProject/predict.py
中导入了上面的utils
里面的模块,所以如果我运行predict.py
这个文件那么当前的工作目录实际上就是MyProject/
,我在MyProject/utils/preprocess.py
里面直接添加上层路径实际上是找不到的,如果要添加的话应该是在环境变量里面添加./utils
这个路径而不是../utils
,这个路径直接添加在要运行的主文件里面就行了,不过亲测加在库文件里面也可以。