2014-05-15 31 views
1

我有一個目錄設置如下:Python的導入模塊沒有發現錯誤

/directory 
/directory/__init__.py 
/directory/setup.py 
/directory/app/db.py 
/directory/app/__init__.py 

/directory/__init__.py文件包含行「導入應用程序」,然後在/directory/app/__init__.py由於行「進口DB」當我嘗試失敗運行setup.py文件。但是,如果我將錯誤行更改爲「從應用程序導入數據庫」,那麼它工作正常。爲什麼是這樣?我猜它與我從父目錄運行它有關。有什麼辦法可以做到這一點?或者,即使從應用程序文件夾中調用了所有導入,也要將它們更改爲「從應用程序導入x」?

感謝您的任何澄清。

編輯:這裏的錯誤:

Traceback (most recent call last): 
File "setup.py", line 2, in <module> 
import app 
File "/directory/app/__init__.py", line 1, in <module> 
import db 
ImportError: No module named 'db' 

EDIT2:這裏是/directory/app/__init__.py文件(/directory/__init__.py爲空)

import db 
from flask import Flask, render_template 

DEBUG = True 

app = Flask(__name__) 

app.config.from_object(__name__) 

@app.route("/") 
def hello(): 

    return render_template() 

def run(host, port): 
    db.init_db() 

    app.run(host=host, port=port) 

最後編輯: 我已經改寫我的問題here,並給予正確的回答。我不確定python3的變化是否相關。謝謝!

+1

如果您發佈錯誤和堆棧跟蹤 –

+1

我無法重現這個問題這將有助於:https://gist.github.com/sharth/145bc486f10343a1869c –

+0

你可以分享你'__init __ py'。文件和至少前兩行'setup.py'? –

回答

1

像@sharth一樣,我試圖複製文件結構並複製錯誤,但沒有成功。唯一可以讓它失敗的方法是刪除db.py。所以你需要確保你的app目錄中確實有db.py文件。

一些方法,它可以逃不過你的眼睛:

  1. 你有一個db.py.txt,或一些其他的擴展。可能你的設置是這樣的,文件擴展名不會自動顯示,所以即使你認爲你正在查看一個python文件,它實際上並不是一個.py文件。

  2. 這個名字得到了錯誤的結果。也許文件名,也許是擴展名。例如,db.oy

  3. 你有舊的.pyc文件。當我測試這個時,我刪除了db.py,但它仍然有效,因爲我仍然在目錄中有.pyc文件。只是在我刪除他們之後發生了錯誤。

+0

但是,當我說「從應用程序導入數據庫」爲什麼會工作? –

+0

@ user2744821嘗試刪除所有'* .pyc'文件,然後同時測試'from app import db'和'import app'。 –

+0

不好。感謝您的幫助!它看起來像範圍不調整,進口總是試圖從根文件夾...如果我從/directory/app/__init__.py運行__init__.py然後它運行良好。 –

0

__init__.py目錄中的文件應該爲空,因爲該文件是「魔術文件」。 所以你必須考慮重新設計導入你的軟件包! 因此,讓您的__init__.py文件爲空,然後它應該工作!

相關問題