2017-02-22 129 views
0

我正在學習Python和第3行收到我的第一個錯誤:導入錯誤:無法導入名稱 '富'

這裏是我的代碼:

app.py

import logging.config 

from flask import Flask, Blueprint 
from platform import settings 

app = Flask(__name__) 


def main(): 
    app.run(debug=settings.FLASK_DEBUG) 

if __name__ == "__main__": 
    main() 

我的文件結構是這樣的:

project_name 
|--platform 
| |--api 
| |--database 
| |-- __init__.py 
| |-- app.py 
| |-- settings.py 
|--logging.conf 
|--requirements.txt 
|--readme.md 
|--setup.cfg 

我使用PyCharm IDE和前ecute在終端:python platform\app.py 然後我收到此錯誤:

Traceback (most recent call last):

File "platform\app.py", line 4, in

from platform import settings

ImportError: cannot import name 'settings'

任何想法有什麼不對嗎?

這裏是我的settings.py

# Flask settings 
FLASK_SERVER_NAME = 'localhost:5000' 
FLASK_DEBUG = True # Do not use debug mode in production 

# Flask-Restplus settings 
RESTPLUS_SWAGGER_UI_DOC_EXPANSION = 'list' 
RESTPLUS_VALIDATE = True 
RESTPLUS_MASK_SWAGGER = False 
RESTPLUS_ERROR_404_HELP = False 

# MYSQL settings 
MYSQL_DATABASE_URI = 'blablalba' 
MYSQL_TRACK_MODIFICATIONS = False 

PYMYSQL_CONNECTION = { 
    'host': '123.456.789.111', 
    'port': 3306, 
    'user': 'root', 
    'passwd': 'password', 
    'db': 'database' 
} 
+0

我猜'settings'應該是一個函數而不是文件。 –

+0

如果你執行'python -m platform.settings'會發生什麼? –

+0

@MadPhysicist,我在終端運行,沒有任何事情發生,只是空的換行 – AnD

回答

1

您有一個名爲platform包,但你正試圖在它執行腳本。當你這樣做時,腳本將獨立運行,沒有包信息,因爲腳本沒有被導入。做一個適當的導入,然後運行一個腳本,使用-m選項:

python -m platform.app 

這將從platform包,建立依賴關係正確導入腳本等

一般情況下,你會出於這個確切原因,希望將可執行腳本放置在主包之外。如果您修改文件夾結構,看起來像這樣的命令python app.py應該運行得很好,因爲platform將是一個公認的包:

 

project_name 
|--platform 
| |--api 
| |--database 
| |-- __init__.py 
| |-- settings.py 
|-- app.py 
|--logging.conf 
|--requirements.txt 
|--readme.md 
|--setup.cfg 

最後,作爲一個小雞蛋裏挑骨頭,如果你決定保持app.py在封裝級別,而不是項目級別,我會建議使用相對進口來獲得設置:

from . import settings 
+0

謝謝,你是這麼說,我應該使用:'python -m platform.app'來執行app.py?而不是'python platform \ app.py'?它顯示了我的進步,但如果在我的:'def main()'我有'app.run(debug = settings.FLASK_DEBUG)'它會拋出'ImportError:無法再次導入名稱'settings'錯誤。如果我將'app.run(debug = settings.FLASK_DEBUG)'改成'app.run()'它工作的很好,但它會讓我迷惑...... – AnD

+0

那麼我如何訪問settings.FLASK_DEBUG,然後將它傳遞給應用程序.run(這裏)? – AnD

+0

@AnD,其中'main'是什麼,導入是什麼樣的。請在您的問題中發佈該代碼 –

0

你所擁有的一切設置罰款,我的猜測是,你正在使用settings.py作爲常量文件。所以不是

from platform import settings 

嘗試從文件導入的值比較(因爲這兩個app.pysettings.py是在同一個目錄)

from settings import * 

,然後你可以用它們像

print(FLASK_SERVER_NAME) 

雖然這可以正常工作,但我喜歡做一點不同,以便最終不會摸到我的頭,試圖找出常數或函數com從哪裏。這裏是我的2美分

import settings.py as configs # or any variable name you want to use 

print(configs.FLASK_SERVER_NAME) 
# more understandable as now you know FLASK_SERVER_NAME is coming from configs 
+0

謝謝,但我試過:'import settings.py作爲配置,但我收到了這個:'ImportError:沒有名爲'settings.py'的模塊; '設置'不是一個包' – AnD

+0

你能告訴我你試圖運行哪個目錄以及你使用了什麼命令?這只是你的情況下的相對路徑問題。 –

+0

嗨,我運行:python平臺/ app.py裏面的平臺文件夾 – AnD

-2

您可以馬上使用import settings代替

相關問題