2013-07-24 67 views
14

我有兩個文件app.pymod_login.py導入錯誤:無法導入名稱

app.py

from flask import Flask 
from mod_login import mod_login 

app = Flask(__name__) 
app.config.update(
    USERNAME='admin', 
    PASSWORD='default' 
) 

mod_login.py

# coding: utf8 

from flask import Blueprint, render_template, redirect, session, url_for, request 
from functools import wraps 
from app import app 

mod_login = Blueprint('mod_login', __name__, template_folder='templates') 

和Python返回此錯誤:

Traceback (most recent call last): 
    File "app.py", line 2, in <module> 
    from mod_login import mod_login 
    File "mod_login.py", line 5, in <module> 
    from app import app 
    File "app.py", line 2, in <module> 
    from mod_login import mod_login 
ImportError: cannot import name mod_login 

如果我刪除from app import app,代碼將會正常工作,但我如何才能訪問app.config

+1

如果你只是試圖從'進口mod_login *'和'從應用程序導入*' – Sebastian

+2

可能重複[ImportError:Can not import name X](http://stackoverflow.com/questions/9252543/importerror-cannot-import-name-x) –

+0

@Sebastian謝謝 - 這是一個節省!我沒有看到循環引用,但仍然收到上述錯誤。使用'*'幫助。我不知道這是什麼邏輯。 – Anupam

回答

29

的問題是,你有一個圓形的導入:在app.py

from mod_login import mod_login 

在mod_login.py

from app import app 

這不是在Python允許 。有關更多信息,請參見Circular import dependency in Python。總之,該解決方案是

  • 或者使用本地進口
+0

這是一個很好的解決方案將導入到本地範圍。它不需要大量的代碼重構,並且可以非常快速地完成。 – WhiteAngel

+0

有什麼其他原因爲什麼會發生這種情況? 「無法導入名稱X」 – Martian2049

+0

沒有回溯,這只是一個瘋狂的猜測...... – hivert

11

,如果你一直對你的腳本這也可能發生在一個大文件

  • 延遲進口的一個收集一切,函數並且一直在移動它們(即,改變定義的位置),這可能意外地創建了循環引用。

    您可能會發現,如果你只是重置IPython的情況解決籽粒以清除任何舊的分配:

    %reset 
    

    或菜單 - >重啓終端

  • +1

    謝謝你。在我的公司,我們構建了python,但它也只是在沒有構建的情況下工作,除非我像我說的那樣重命名了所有文件。所以這讓我想到了實際重建,解決了問題。哇噢! –

    +3

    在我的情況下,我將一個python腳本重構爲不同的模塊,留下了一些舊的.py和.pyc文件,並且偶然發現了「無法導入名稱」錯誤。經過對循環引用的無用搜索之後,您的回答使我以正確的方式 - 刪除舊文件取得了訣竅。謝謝 – dipanda

    +2

    想指出這是一個救星。我沒有一個循環引用,並且爲什麼會發生這個問題而感到困惑。 –

    1

    而不是使用本地進口的,你可以導入整個模塊而不是特定的對象。然後,你app模塊中,調用mod_login.mod_login

    app.py

    from flask import Flask 
    import mod_login 
    
    # ... 
    
    do_stuff_with(mod_login.mod_login) 
    

    mod_login.py

    from app import app 
    
    mod_login = something 
    
    相關問題