以不同的方式执行脚本时,导入行为会有所不同吗?

时间:2019-07-16 13:05:29

标签: python import

假设我们有这个文件树:

test
├── config.py
├── main.py
└── network
    └── arduino.py
如下所示,

main.py导入arduino.py,而arduino.pyconfig.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

1 个答案:

答案 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,它将使软件包中的绝对导入有效。