【问题标题】:import behaves differently when executing the script in different ways?以不同方式执行脚本时,import 的行为是否不同?
【发布时间】:2019-11-25 05:32:58
【问题描述】:

假设我们有这个文件树:

test
├── config.py
├── main.py
└── network
    └── arduino.py

正如你在下面看到的main.py 导入arduino.pyarduino.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

【问题讨论】:

  • 我明白了,我花了一段时间才明白你到底在尝试什么。执行文件会将其父文件夹添加到PYTHONPATH,这使得从该目录导入成为可能。这是隐式发生的,所以除非你在某个时候遇到它,否则没有办法知道它......就像你今天所做的那样 =)
  • 谢谢,很有帮助

标签: python import


【解决方案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,这将使您的包中的绝对导入工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多