2012-12-29 147 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加载它。