2016-07-07 78 views
1

我正在尝试修改模块的导入名称,具体取决于我是否在笔记本中。 我想是这样笔记本中的条件导入python

api.py

is_notebook = False 
if is_notebook: 
    from tqdm import tnrange as trange 
    from tqdm import tqdm_notebook as tqdm 
else: 
    from tqdm import trange 
    from tqdm import tqdm 

,并在笔记本电脑的电池,我会做:

import api 
api.is_notebook = True 

但它似乎并没有工作。 我该如何做到这一点?

+0

什么是错误你得到了什么? –

+0

我没有任何错误,但不会修改导入。 – Orelus

+0

1.你尝试过“尝试 - 除外”吗? 2.你有没有为导入调试代码;尝试通过添加一个打印语句在try和除了块? –

回答

0

,我认为我们可以通过中间文件abc.py这样达到相同的:的abc.py

is_notebook = False 
if is_notebook: 
    from tqdm import tnrange as trange 
    from tqdm import tqdm_notebook as tqdm 
else: 
    from tqdm import trange 
    from tqdm import tqdm 

然后在产品代码

内容尝试这样的:

from abc import trange 
from abc import tqdm 

您将得到trange和tqdm的正确代码。

0

api.py

def imports(is_notebook): 
    if is_notebook: 
     from tqdm import tnrange as trange 
     from tqdm import tqdm_notebook as tqdm 
    else: 
     from tqdm import trange 
     from tqdm import tqdm 

导入api.py调用这个函数后:

api.imports(True) 
0

这是一个有点哈克解决方案依托的方式Python模块导入的工作原理,以及它可能会很容易中断。我很抱歉。

在您的代码中,只有在导入模块api后才将笔记本设置为True,因此它不起作用。但是,在模块加载之前,您也无法访问笔记本变量,因为您没有参考。 解决方案是制作第三个模块,我们称它为“notebook.py”,它只是一个空文本文件。

在您的主体中,您首先调用“导入笔记本”来创建笔记本模块的全局实例。然后将该模块中的笔记本属性设置为true或false。

接下来,导入api。从api,也进口笔记本电脑模块。 Python很聪明,只是给你一个对同一个对象的引用,而不是再次加载模块。现在你可以使用这个模块的“notebook”属性来检查要加载的子模块。

最后COAD看起来像这样:

notebook.py:

#no actual code here 

main.py

import notebook 
notebook.notebook=True 
import api 

api.py

import notebook 
if notebook.notebook: 
    from tqdm import tnrange as trange 
    from tqdm import tqdm_notebook as tqdm 
else: 
    from tqdm import trange 
    from tqdm import tqdm 
相关问题