为什么python中的导入顺序会混淆导入的导入函数?

时间:2018-01-26 18:04:53

标签: python python-2.7 import

我有以下场景[文件的结构在下面提供]。

我有一个脚本script.py,其中包含一个我调用渲染图像的函数。渲染器使用一些调用某些库(opendr)。

我发现,如果我的脚本函数中的导入按特定顺序排列,那么我的渲染图像将完全变黑,但是以不同的方式排列渲染就可以了。

在进行了导入后,我发现了script.py中的两个有问题的导入: data_paths.data_paths render.render 。我进一步挖掘并发现了两个文件中存在问题的导入:render.py中的 PI1 data_paths.py中的 PI2 。如果在PI2之前导入PI1,它会起作用,否则不起作用。我甚至尝试导入PI1然后导入data_paths.py(导入PI2),然后导入render.py(导入PI1)并且它可以正常工作。唯一重要的是在PI2之前导入PI1,无论导入的文件是什么。

现在PI1是一个外部库调用,所以我无能为力,而PI2是一个内部库调用。所以我进一步调查了。如果我将PI2导入的函数复制到data_paths.py,则渲染工作(相同名称或不同名称 - 无关紧要)。 如果我评论utils.py中定义的所有其他函数,但PI2导入的函数和script.py中需要的其他函数,则它不起作用。

我不明白为什么我会有这种行为以及如何确保我不再有这个bug,因为我会在render.py中使用相当多的函数,我不想要总是将我的进口产品洗牌,并且永远不确定它是否会起作用。

我认为script.py中的导入顺序很重要,但我不明白它为什么会影响导入导入的函数。我也不明白为什么将函数get_machine.py移动到data_paths.py有帮助,但是对原始文件中的多余内容进行注释却没有。

很抱歉,我无法提供正确的演示,许可证和整个库都需要安装很多代码。

# script.py
from data_paths import data_paths
from render import render

def main():
  render()

这就是render.py类似

的方式
# render.py
from opendr.renderer import ColoredRenderer # problematic import 1
# ... other imports

def render():
  # function body

这就是data_paths.py的样子

# data_paths.py
from utils import get_machine # problematic import 2

if get_machine=='whatever':
  RANDOM_GLOBAL_VARIABLE1 = 'value1'
else:
  RANDOM_GLOBAL_VARIABLE1 = 'value2'

ANOTHER_GLOBAL_VARIABLE1 = 1
ANOTHER_GLOBAL_VARIABLE2 = 1

class data_paths:
  a bunch of functions

最后,utils.py:

# utils.py
def get_machine():
  # function body

def needed_function():
  # function body

def not_needed_function1():
  # function body

def not_needed_function2():
  # function body

0 个答案:

没有答案