我有以下场景[文件的结构在下面提供]。
我有一个脚本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