2012-12-29 145 views
2

我最近將一個Django項目從sqlite3切換到了postgres。我想從放置在隱藏目錄中的模塊讀取db密碼。從隱藏目錄導入模塊(包)

.secrets 
    __init__.py 
    db.py # DB_PASSWORD = 'mypassword' 

如何從放置在隱藏的.secrets目錄中的db模塊導入DB_PASSWORD?以下不起作用(導入錯誤):

from .secrets.db import DB_PASSWORD 

我是否必須使用__import__詭計?對於代碼樣式約定,我寧願留在from/import模式。

回答

0

我在Python reference找到了正式答案。

from形式是:

"from" relative_module "import" identifier ["as" name] ("," identifier ["as" name])* 

"from" module "import" "*" 

在第一種形式的點無關與「隱性套餐」錯誤的概念,它是指相對於進口(正如Thomas Orozco所提到的)。在第二種形式中,模塊被定義爲如下:

module ::= (identifier ".")* identifier 

和標識符must start with a letter

正如你所建議的,我將使用外部配置文件,而不是Python代碼。

2

在Python中,from .module import something的語法是for relative imports

因此,如果您嘗試在軟件包名稱中使用前導點,Python會感到困惑並嘗試進行相對導入,從而導致失敗。

相關提示,做import .module實際上是一個SyntaxError


我不認爲這是如此糟糕,但。只需將你的祕密存儲在別的地方,並將其添加到你的路徑的其他地方,或者將它放在一個你可以打開的文件中(例如,一個JSON配置文件)。

3

從PEP 328,http://www.python.org/dev/peps/pep-0328/#rationale-for-relative-imports實際上應該避免命名開始「點」,因爲這意味着在Python相對導入一個Python模塊。

如果您確實堅持這樣做,您可以但不得不使用imp模塊。

用法示例: -

import imp 
with open('.secret/__init__.py', 'rb') as fp: 
    secret = imp.load_module('.secret', fp, '.secret/__init__.py', \ 
    ('.py', 'rb', imp.PY_SOURCE)) 

所以您的使用情況下,你想從db.py中值加載,它會是這個樣子: -

import imp 
with open('.secret/db.py', 'rb') as fp: 
    db = imp.load_module('.secret', fp, '.secret/db.py', \ 
    ('.py', 'rb', imp.PY_SOURCE)) 

print db.DB_PASSWORD # This will print out your DB_PASSWORD's value. Or use it whichever way you want. 

不會提供建議它雖然。

1

您應該使該db.py一個配置文件,並加載它與configparser。或者,您可以將其存儲爲JSON文件並使用json加載它,或將其存儲爲YAML並使用PyYAML加載它。