python import 问题"ModuleNotFoundError: No module named "

本文介绍了在Python中遇到'ModuleNotFoundError: No module named'的问题,详细分析了Python的导入机制,包括'import a'和'from . import a'的区别。通过一个具体的例子展示了在嵌套导入时可能出现的错误,解释了错误的原因并提出了两种解决方案:修改导入语句或添加查找模块路径。

今天用到嵌套import的时候发现一个问题。请看下面:
在这里插入图片描述
看上面的test1的包,下面是各个源文件的内容:

#a.py
def p():
    print("12345")
#b.py
import a
#from . import a
def bi():
    a.p()
#c.py
from .src import b
def yi():
    print("wo")
    b.bi()
#d.py
# import sys
# sys.path.append('./py/src')
import py.c
if __name__ == '__main__':
    py.c.yi()

这里运行d.py就会报错:

/home/andy/anaconda3/bin/python /home/andy/work/mypython/test/test1/d.py
Traceback (most recent call last):
  File "/home/andy/work/mypython/test/test1/d.py", line 3, in <module>
    import py.c
  File "/home/andy/work/mypython/test/test1/py/c.py", line 2, in <module>
    from .src import b
  File "/home/andy/work/mypython/test/test1/py/src/b.py", line 2, in <module>
    import a
ModuleNotFoundError: No module named 'a'

Process finished with exit code 1

这是为什么呢?这涉及到Python的导入的机制,要弄清楚这个问题首先清楚Python的导入机制。下面先让我们来了解一下该机制。

(1)import a 首先这句语句的做了哪些事:

创建命名空间‘a’。 在‘a’命名空间中倒入a.py代码,然后执行a.py的代码。

(2)from . import a 这语句是和“import a”是有些不同的
这语句是在当前的命名空间(‘b’的命名空间)中倒入a.py的代码,然后执行a.py中的代码,并不会创建新的命名空间‘a’。

那上面的到底是什么问题呢,我们来看一下:
b.py中:
import a 如上(1)解释,会创建新的命名空间‘a’

c.py中:
from .src import b
这句语句是在当前命名空间‘c’ 倒入src包的b模块代码(也就是b.py的代码),然后执行b中的代码,但b中的代码有一句语句‘import a’,记住这是在当前的命名空间,当前的工作目录是c.py 同级的路径。它会在c.py同级路径下查找a 模块,但其实是找不到的。因为a模块是在‘./src/’下的。所以就会出错

d.py中:import py.c
创建新的命名空间,然后倒入c.py的代码,当执行到from .src import b,就如上面的解释一样了,发生问题了。

解法一:
把b.py 中的‘import a’ 改为‘from . import a’

解法二:
在d.py文件中加上以下语句,添加查找模块的路径,让解释气可以查找到a模块。

import sys
sys.path.append('./py/src')
sys.path.append('./py/')
import py.c
if __name__ == '__main__':
    py.c.yi()

文章写的不好,有些术语不知道怎么表述,如有错误的地方可以指出来,等我也学习以下。

### Python 中 `ModuleNotFoundError: No module named 'java'` 的解决方案 当遇到 `ModuleNotFoundError: No module named 'java'` 错误时,这意味着 Python 尝试导入名为 `java` 的模块但未能成功找到它。以下是几种可能的解决方案: #### 1. 安装 Jython 或 Pyjnius 库 如果目标是在 Python 中调用 Java 代码,则可以考虑使用专门为此目的设计的库。 对于 **Jython**: Jython 是一种可以在 JVM 上运行并能够无缝集成 Java 类库的 Python 实现方式。通过安装 Jython 可能解决问题[^4]。 ```bash wget https://downloads.sourceforge.net/project/jython/Jython%20Installer/2.7.2/jython_installer-2.7.2.jar java -jar jython_installer-2.7.2.jar ``` 对于 **Pyjnius**: 这是一个允许 Python 调用 Java 方法并与之交互的工具包。可以通过 pip 安装 pyjnius 来实现这一功能。 ```bash pip install pyjnius ``` #### 2. 检查环境变量设置 确保 JAVA_HOME 和 PATH 环境变量已经正确设置了指向 JDK 或者 JRE 的位置。不正确的环境变量可能导致某些依赖于这些路径的 Python 扩展无法正常工作。 #### 3. 使用合适的 Python 版本 确认所使用的 Python 解释器版本支持所需的特性以及第三方库的要求。有时候特定的功能只存在于较新的 Python 发行版中。 #### 4. 验证是否确实存在 java 模块 值得注意的是,在标准 CPython (即官方发布的 Python) 中并没有内置叫做 “java”的模块;因此除非特别安装了同名的自定义模块或者是上述提到过的特殊解释器(如 Jython),否则直接尝试 import java 几乎肯定会失败。 ```python try: import java except ImportError as e: print(f"Error occurred while importing the module: {e}") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值