IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 解决在命令行终端执行Python脚本时提示ModuleNotFoundError: No module named ‘xxxxxxx‘的问题 -> 正文阅读

[Python知识库]解决在命令行终端执行Python脚本时提示ModuleNotFoundError: No module named ‘xxxxxxx‘的问题

前言

??本篇博客主要分析在命令行执行Python脚本时提示ModuleNotFoundError: No module named 'xxxxxxx'产生的原因,并给出了解决方法。

1. 问题描述

??在项目开发过程中遇到了一个问题:项目代码在PyCharm中能够正常运行,但是通过命令行终端运行Python脚本时出现ModuleNotFoundError: No module named 'xxxxxxx',其中'xxxxxxx'不是通过pip安装的,而是自定义的package。为了更好更直观地分析问题,我模拟了问题发生的工程代码文件目录:

.
├── package1
│   ├── __init__.py
│   ├── package1_1
│   │   ├── __init__.py
│   │   └── pkg1_1.py
│   ├── package1_2
│   │   ├── __init__.py
│   │   └── pkg1_2.py
│   └── pkg1.py
└── package2
    ├── __init__.py
    ├── package2_1
    │   ├── __init__.py
    │   ├── package2_1_1
    │   │   ├── __init__.py
    │   │   ├── main.py
    │   │   └── pkg_2_1_1.py
    │   └── pkg2_1.py
    └── pkg2.py
# main.py
import argparse
from package1 import pkg1
from package2 import pkg2
from package1.package1_2 import pkg1_2
from package2.package2_1 import pkg2_1
import pkg_2_1_1


parser = argparse.ArgumentParser()

parser.add_argument('--execmd', type=str, required=True, help='execute file yes or no')
parser.add_argument('--nums', type=int, default=1, help='execute nums')
args = parser.parse_args()


def main():
    pkg1.print_info()
    pkg2.print_info()
    pkg1_2.print_info()
    pkg2_1.print_info()
    pkg_2_1_1.print_info()


if __name__ == '__main__':
    if args.execmd == 'yes':
        for i in range(args.nums):
            print('{:*^35}'.format(i))
            main()
            print('{:*^35}'.format(i))
    else:
        print('nothing to do.')

??代码不难理解,下面在PyCharm中配置一下输入的参数并运行该代码:

在这里插入图片描述

在这里插入图片描述
??下面在命令行终端运行main.py文件,代码运行命令为:

	# 运行命令
	python main.py --execmd=yes --nums=1

	# 运行结果
	Traceback (most recent call last):
	  File "main.py", line 2, in <module>
    	from package1 import pkg1
	ModuleNotFoundError: No module named 'package1'

在这里插入图片描述
??执行main.py文件报错了!!!!

2. 问题原因

??根据代码的错误信息可以了解到,代码在执行的过程中,Python解释器没有找到package1package1是自定义的一个包,根据上面的文件目录的树结构可以看到package1这个包确实是存在的,但是Python解释器却没有发现,这么明显的一个包竟然看不见?????

在这里插入图片描述
??那就得想一想为啥Python解释器找不到这个包,想着想着就想到了。。。。。。

在这里插入图片描述

??咳咳,不知道有没有用过百度的AI Studio,在新建项目的时候,平台会默认给我们创建一个Jupyter文件:

在这里插入图片描述

??在文件的最下面有几条命令:

# 如果需要进行持久化安装, 需要使用持久化路径, 如下方代码示例:
# If a persistence installation is required, 
# you need to use the persistence path as the following: 
!mkdir /home/aistudio/external-libraries
!pip install beautifulsoup4 -t /home/aistudio/external-libraries

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: 
# Also add the following code, 
# so that every time the environment (kernel) starts, 
# just run the following code: 
import sys 
sys.path.append('/home/aistudio/external-libraries')

??每次运行项目的时候不必每次都要安装项目所需的包,可以在pip安装包的时候指定安装的文件路径,使用的时候再通过sys.path引入相关的包。
??此时此刻,问题应该已经有了答案,加入sys.path之后Python解释器就会去这个路径下找项目所需的package。下面就分析一下这个sys.path是干甚的(PS:不分析也知道,跟路径有关)。

3. sys.path

??sysPython内置的一个模块,是一个与系统相关的参数和函数,具体可参见官方文档。而sys.path是一个一个由字符串组成的列表,用于指定模块的搜索路径,其中path[0]目录含有调用 Python解释器的脚本,具体可参阅官方文档

在这里插入图片描述
??现在知道了为什么在命令行终端执行Python文件有时候会出现ModuleNotFoundError: No module named 'xxxxxxx',但还有一个问题,为什么在PyCharm中可以执行呢?
??打印一下默认的搜索路径就知道了,也就是打印一下sys.path

# pycharm中的结果
['/home/liyanpeng/Documents/coder/pywork/myproject/package2/package2_1/package2_1_1', 
'/home/liyanpeng/Documents/coder/pywork/myproject', 
'/usr/share/pycharm-2021.2/plugins/python/helpers/pycharm_display', 
'/home/liyanpeng/anaconda3/envs/pytorch/lib/python36.zip', 
'/home/liyanpeng/anaconda3/envs/pytorch/lib/python3.6', 
'/home/liyanpeng/anaconda3/envs/pytorch/lib/python3.6/lib-dynload', 
'/home/liyanpeng/anaconda3/envs/pytorch/lib/python3.6/site-packages', 
'/usr/share/pycharm-2021.2/plugins/python/helpers/pycharm_matplotlib_backend']

# terminal中的结果
['/home/liyanpeng/Documents/coder/pywork/myproject/package2/package2_1/package2_1_1', 
'/home/liyanpeng/anaconda3/envs/pytorch/lib/python36.zip', 
'/home/liyanpeng/anaconda3/envs/pytorch/lib/python3.6', 
'/home/liyanpeng/anaconda3/envs/pytorch/lib/python3.6/lib-dynload', 
'/home/liyanpeng/anaconda3/envs/pytorch/lib/python3.6/site-packages']

??可以看出,PyCharm中的搜索路径和命令行终端的搜索路径还是略有区别的,列表中的第一个文件目录表示的是脚本文件,也就是main.py所在的目录,对应的第二个元素就不一样了,命令行终端的搜索路径列表中没有'/home/liyanpeng/Documents/coder/pywork/myproject',相必已经猜到了,没错,这个目录就是package1所在的目录,也就是本项目的根目录:

在这里插入图片描述

4. 解决方法

??在main.py中加入该目录,如何加???,加在哪???

# main.py
# 建议加在最顶部
import sys
sys.path.append('/home/liyanpeng/Documents/coder/pywork/myproject')

import argparse
from package1 import pkg1
...

parser = argparse.ArgumentParser()

parser.add_argument('--execmd', type=str, required=True, help='execute file yes or no')
parser.add_argument('--nums', type=int, default=1, help='execute nums')
args = parser.parse_args()
...

??再次执行命令:python main.py --execmd=yes --nums=1,即可运行成功:

在这里插入图片描述

结束语

??一般提示ModuleNotFoundError: No module named 'xxxxxxx'得到时候就要考虑两个问题,如何'xxxxxxx'是第三方的安装包,那通过pip install xxxxxxx,即可解决;如果是自定义的包,那么就要考虑是路径的问题,尤其是在命令行终端的时候,根据报错的具体文件信息,在相应的文件里面(建议在最顶部)通过sys.path加入项目的根目录。可能还有小伙伴遇到过,在PyCharm中执行的时候也会出现ModuleNotFoundError: No module named 'xxxxxxx',而且'xxxxxxx'也是自定义的包,此时可以将项目路径设置为根目录即可解决,具体操作为:在项目的根目录上右键 --> Mark Directory as --> Sources Root

在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 15:03:18  更:2021-08-20 15:03:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 8:59:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码