Python中import模块失败的问题如何解决?
代码如下:
import os
try:
import winshell
except:
os.system(‘python -m pip install --upgrade pip’)
os.system(‘pip install pywin32’)
os.system(‘pip install winshell’)
import winshell
print(‘hello world’)
我的本意是导入 winshell 这个模块,要是机子里没这个模块的话,就先安装再导入,但是运行的时候报错了

看运行过程,明明的确按计划安装了两个所需的模块,但是接下来又报错说没有 winshell 模块,这是怎么回事?
第二遍运行的话又没问题,说明第一遍的确安装成功了两个模块,但是第一遍的报错是怎么一回事呢?
Python中import模块失败的问题如何解决?
我的理解:
python 安装后是不是还要更新类似索引等操作。
而安装成功后直接就调用了,根本没等索引什么的重建完成
故报错
遇到 import 失败,先别慌,跟着下面这个排查路径走,基本都能搞定。
第一步:检查模块名拼写和大小写 这是最常见的问题,Python对大小写敏感。确保你导入的模块名和实际文件名完全一致(包括.py后缀前的部分)。
第二步:确认模块是否在Python搜索路径中
Python会在 sys.path 列出的目录里查找模块。如果模块不在这些路径下,自然找不到。
import sys
print(sys.path)
# 如果你的模块在 /home/user/my_modules,可以临时添加
sys.path.append('/home/user/my_modules')
更规范的做法是把模块所在目录加到 PYTHONPATH 环境变量里。
第三步:检查文件结构和 __init__.py
对于包(包含多个模块的目录),确保每个目录下都有 __init__.py 文件(即使是空的),这是Python识别为包的必要条件。
my_package/
├── __init__.py
├── module_a.py
└── subpackage/
├── __init__.py
└── module_b.py
然后通过 from my_package import module_a 或 from my_package.subpackage import module_b 导入。
第四步:处理循环导入 两个模块互相导入会导致问题。重构代码,将公共部分移到第三个模块,或者将导入语句移到函数内部。
第五步:检查Python环境
如果你用了虚拟环境(venv, conda),确保当前激活的环境里安装了你要导入的模块。对于第三方库,用 pip list 看看是否已安装。
第六步:IDE/编辑器特定路径 有些IDE(如PyCharm)有自己的项目结构设置,可能需要将源目录标记为“Sources Root”。检查IDE的设置。
总结:按拼写、路径、结构、依赖的顺序排查。
试试把 site-packages 的路径加入到 PYTHONPATH 环境变量
用了 anaconda 之后就再也没碰到这些问题了
你可以考虑下用类似的工具
神奇之处在于,按这样子做,requests 模块又没关系

但是 requests 模块这样子的话又没问题
我的问题是为什么第一遍运行的时候会出问题,但是第二遍就没问题了
明白。。
在 python 脚本里运行 pip 安装包有点奇怪。
应该和 python 的加载机制有关。你可以查下文档,https://docs.python.org/3/reference/import.html#searching
这个不是运维的事吗,为啥要在代码里写这些东西……
requirements.txt 了解一下
把第二个 import winshell 换成 subprocess.Popen([‘python.exe’, os.path.realpath(file)], creationflags=0x00000008)试试
主要是这种方法装 requests 模块又没问题
主要是这种方法装 requests 模块又没问题
你这报错说winshell找不到wincon,真要搞明白就得去了解下 python 模块加载机制了。。。
还是不要纠结这个问题了,就在运行 python 脚本前先安装了依赖。。
浪费时间在这个地方没意义,非常规操作…
win32 什么的应该还是 dll 吧,,requests 和它的依赖都是纯 Python 的,可能是这点区别,加载机制不一样吧……
使用 sys.path.insert 重新添加环境目录
第一次执行脚本,脚本安装 package,当执行到 import 语句,刚刚安装好的 package 还没有被索引到。我猜是这个原因。
13 楼很有可能是正解, 楼主这种情况是 request 不需要依赖 dll,winshell 肯定依赖 windows,话说什么场景为要这样动态导入?
reload sys.modules

