Python:No module named问题详解

一、sys.path

1、当你import一个模块或者包时,Python解释器便会从sys.path中对应的路径向下递归查询(即包含子目录的查询)是否含有该模块的定义,这里是Python文档对sys.path的定义:

sys.path
A list of strings that specifies the search path for modules. Initialized from the environment variable PYTHONPATH, plus an installation-dependent default.
指定模块搜索路径的字符串列表。由环境变量PYTHONPATH初始化,加上安装依赖的默认值。

As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter.Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH.
当程序启动时进行初始化时,该列表的第一项路径[0]是包含用于调用Python解释器的脚本的目录。注意,脚本目录是在作为PYTHONPATH结果插入的条目之前插入的。

(1)从上面我们可以看到,sys.path是一个字符串列表,包含了程序运行时查找模块或者包的路径,我们可以print(path)来查看当前运行时查找路径。
(2)对于可能长期用到的路径,可直接修改系统 PYTHONPATH变量。
(3)需要注意的是,path是在你每次执行该文件时进行的初始化,且path[0]初始化为你当前运行脚本所在的目录,其他则是Python内置模块或者虚拟环境的路径。

2、看个例子:

得到的列表如下:
在这里插入图片描述


二、模块和包导入问题

1、 在python 3.x之前,目录中含有__init__.py即为包,包是对一系列py模块的集合或者说打包,想要调用包中的模块目录中必须要有__init__.py文件;而在python3.x之后去除了这一要求,意味着即使目录中没有__init__.py,也会被识别为包从而调用包中的模块。

2、下面来说说导入模块或包时的常出现的问题:
项目根目录   BASEPATH  下有a、b包和main.py,a、b包内分别有a_module、b_module模块,此外a包中还有另一个用于测试的main.py。
在这里插入图片描述
(1)一般来说在根目录下的mian.py里调用a和b包内的模块(包括所有子目录模块)  或者  同级目录下调用模块 是没有任何问题的! 唯一需要注意的是在import时写明是哪个包的哪个模块。

(2)但是当你想在a包的main.py中调用 b包里的模块时问题就来了: 在这里插入图片描述

没找到模块b,为啥?原因在于sys.path在初始化时只包含 当前执行文件所在的目录路径 和系统环境路径(特殊时为虚拟环境里包含的路径),你执行的是 a包内的main.py,sys.path列表的第一项便初始化为 e:\PythonCode\BathPath\a可见其目录树下并没有包含 b包


如何解决:

法一:

其实这算不上解决办法,只是行为规范,毕竟没有人会在项目的包(比如a包)内执行主函数main,而当你在 高层目录或者项目目录下执行主函数或模块时这里为BasePath下的main.py)你根本无需担心下一层的包与包之间的调用问题。

故使用绝对或者相对路径都行,一般的:在包内的模块间相互调用使用相对路径;包与包之间的调用使用绝对路径,当然也可以都用绝对路径。(需要说明的是绝对路径的根目录应该是你项目最顶层的目录而不是文件的根目录)。

此时sys.path列表的第一项会初始化为 e:\PythonCode\BasePath及其递归查找到的子目录。但要注意互相导入等问题。

例如:在a.a_module中导入b包b_module内的函数并在BasePath目录下的main.py中调用它:
在这里插入图片描述


法二:

用sys.path.append()即可,如果有一个自己写的包你觉得会长期用到你也可以修改环境变量PYTHONPATH加到里面去。
在这里插入图片描述
OK,再次运行a包内的main.py,调用成功

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当出现"ModuleNotFoundError: No module named 'PIL'"错误时,表示Python程序中调用了一个名为PIL的模块,但是该模块并没有被正确安装。这个错误通常是由于缺少所需的库或包导致的。 解决这个问题的方法是安装PIL模块,你可以按照以下步骤进行操作: 1. 使用命令行或终端打开Python的包管理工具(如pip)。 2. 运行以下命令来安装PIL模块:pip install Pillow 3. 如果你使用的是旧版本的Python(如Python 2.x),则需要运行以下命令来安装PIL模块:pip install PIL 4. 等待安装完成后,重新运行你的程序。 通过这些步骤,你应该能够解决"ModuleNotFoundError: No module named 'PIL'"错误,并且成功导入PIL模块。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [已解决ModuleNotFoundError: No module named ‘PIL](https://blog.csdn.net/yuan2019035055/article/details/126322206)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Python pyautogui模块实现鼠标键盘自动化方法详解](https://download.csdn.net/download/weixin_38547887/14849946)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值