问答 用终端执行 module not found xxx,但是用终端执行 python 时 import xxx 可导入

醋精测试媛 · 2022年01月17日 · 最后由 陈恒捷 回复于 2022年01月20日 · 4838 次阅读

第三方库:pandas;如果在终端直接执行 pytest,会报错:

____________________ ERROR collecting tests/test.py _____________________
ImportError while importing test module ''.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/importlib/__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
tests/test.py:17: in <module>
    from utils import check, logger, excel_analyzer
utils/excel.py:4: in <module>
    import pandas as pd
E   ModuleNotFoundError: No module named 'pandas'

但是直接在 python 命令行导入,没问题:

请问是因为 pytest 无法在 sh 中使用的原因吗?如何解决这个问题?

最佳回复

自己试了一下,如果是在 venv 里面刚安装完 pandas ,直接用 pytest 运行,是会这样的。

解决方法:安装完后,通过 deactivate && source venv/bin/activate 退出并重新进入一次,就没问题了。

解决方法查找方式:用 bing 搜索 virtualenv pytest第一个 stackoverflow 的回答就是(虽然内容不大能对上,但原理基本一样,应该都是要重新进入后重新初始化一些环境配置)

你可以试试这个解决方法?

共收到 14 条回复 时间 点赞

看你的 Python 版本,一个是 3.8,一个是,3.8.2 所以怀疑你是不是有两个不同的 Python 版本,在 sh 里面的那个版本没有装对应的 panda 库?

Jerry li 回复

尝试过在命令行执行 “which python3”,呈现的 python3 的位置只有一个

无论你有多少个 python ,which python3 都只会有一个的(它显示的是当前环境变量下 python3 命令的实际路径,这个路径是按照 path 的顺序找的,首次匹配就返回,所以不可能有多个),这个校验方法并不正确。

具体找法可以参考:https://www.zhihu.com/question/270799956

然后这个问题大概率就是楼上所说的你有不止一个 python ,且不同执行环境用的并不是同一个。卸载掉其中一个,或者确保把环境变量都设置为指向同一个就好。

4楼 已删除
陈恒捷 回复

谢谢,我按照了一些方法获取电脑上有多少个 python3,除了有的 3.8.2 之外还有一个 Python 3.9.6,但是好像并没有出现在上面的报错记录里面,而且问题中提到的 python,经过确定,应该是同一个,都是 3.8,只是一个上面那个是文件路径Traceback:
/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/importlib/__init__.py:127
,没有具体到 3.8.2,但是应该是同一个。

我所测试的项目,是使用了 python 虚拟环境 venv 进行第三方库的配置的,如下:(也是 python 3.8)

请问问题应该出在哪里?

venv 里面确认配置和安装了 panda 这个库么?这个虚拟环境的依赖库配置和普通 shell 这些是隔离的,相当于每次都是从一个什么依赖库都没有的干净环境启动。

陈恒捷 回复

确认安装了这个库

你这个路径确认是你用的 venv 安装依赖库的路径么?建议你在你对应的 venv 环境里用 pip freeze 之类的命令确认。

虚拟环境是一个 Python 环境,安装到其中的 Python 解释器、库和脚本与其他虚拟环境中的内容是隔离的,且(默认)与 “系统级” Python(操作系统的一部分)中安装的库是隔离的

出自官方文档:https://docs.python.org/zh-cn/3/library/venv.html#venv-def

陈恒捷 回复

确定如此。

那看来确实有依赖。把你完整的怎么启动 pytest 的方式发一下?详细到手把手级别,看是不是实际执行环境用的不大一样。

陈恒捷 回复

直接用 shell 启动 pytest
1.打开 mac 的终端

2.cd 到项目所在的路径

3.激活 venv 环境并执行 pytest -s

我重新看了下你前面 pip freeze 命令运行环境,命令行最前面没有 (venv) ,说明并不是在 venv 环境中执行。

你按上一层的步骤,在运行 source venv/bin/activate 进入 venv 环境后,再执行 pip freeze 命令看到底有没有装到依赖?没有的话在这个环境内用 pip 命令安装你所需要的依赖就好

asciicast要不换个虚拟环境试一试

陈恒捷 回复


也是有的。可能这是 pytest 的缺陷?

自己试了一下,如果是在 venv 里面刚安装完 pandas ,直接用 pytest 运行,是会这样的。

解决方法:安装完后,通过 deactivate && source venv/bin/activate 退出并重新进入一次,就没问题了。

解决方法查找方式:用 bing 搜索 virtualenv pytest第一个 stackoverflow 的回答就是(虽然内容不大能对上,但原理基本一样,应该都是要重新进入后重新初始化一些环境配置)

你可以试试这个解决方法?

16楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册