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

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

第三方库: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 条回复 时间 点赞
16楼 已删除

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

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

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

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

陈恒捷 回复


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

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

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

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

陈恒捷 回复

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

2.cd 到项目所在的路径

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

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

陈恒捷 回复

确定如此。

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

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

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

陈恒捷 回复

确认安装了这个库

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

陈恒捷 回复

谢谢,我按照了一些方法获取电脑上有多少个 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)

请问问题应该出在哪里?

4楼 已删除

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

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

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

Jerry li 回复

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

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

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