假设我们有这个文件树:
test
├── config.py
├── main.py
└── network
└── arduino.py
如下所示, main.py
导入arduino.py
,而arduino.py
从config.py
的变量导入,该变量位于arduino.py
的父文件夹中。
当我运行main.py
时,一切正常,但是当我运行arduino.py
时,出现此错误:
ModuleNotFoundError:没有名为“ config”的模块
我知道我们不能像以前一样从父文件夹导入,但是当执行main.py时如何完成导入?
请进行任何澄清
arduino.py
from config import some_var
def fun():
print(some_var)
fun()
main.py
from network.arduino import *
fun()
config.py
some_var = 10
我不想从父文件夹导入,我正在寻找解释说明为什么当正在执行的脚本位于此父文件夹中时,此导入工作正常,但实际上是从实际的文件夹脚本进行导入在我的情况下是arduino.py
答案 0 :(得分:1)
当您尝试将模块导入python文件时,解释器会在由PYTHONPATH环境变量定义的多个目录中查找该名称的模块。您可以在运行时通过sys.path
访问它。在arduino.py
中打印并执行它可以向我们展示为什么导入仅在运行main.py
时起作用:
arduino.py
import sys
print(sys.path)
from config import some_var
def fun():
print(some_var)
fun()
运行python3 main.py
时:
['/home/user/test', ..., '/usr/lib/python3/dist-packages']
10
10
运行python3 network/arduino.py
时:
['/home/user/test/network', ..., '/usr/lib/python3/dist-packages']
Traceback (most recent call last):
File "network/arduino.py", line 4, in <module>
from config import some_var
ModuleNotFoundError: No module named 'config'
由于文件config.py
位于/home/user/test
中,因此在第一种情况下可以找到它,而在第二种情况下找不到。
如果您想解决有关导入位置的问题,请参阅python packing tutorial,它将使软件包中的绝对导入有效。