3

我最近将一个 Django 项目从 sqlite3 切换到了 postgres。我想从放置在隐藏目录中的模块中读取数据库密码。

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

如何从隐藏的 .secrets 目录中的 db 模块导入 DB_PASSWORD?以下不起作用(ImportError):

from .secrets.db import DB_PASSWORD

我必须使用这个__import__技巧吗?对于代码样式约定,我更喜欢使用 from/import 模式。

4

4 回答 4

5

从 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.

虽然不会建议。

于 2012-12-30T00:05:04.010 回答
2

在 Python 中,from .module import something语法用于相对导入

因此,如果您尝试在包名称中使用前导点,Python 会感到困惑并尝试相对导入,这将失败。

在相关的说明中,做import .module实际上是SyntaxError


我不认为这很糟糕。只需将您的秘密存储在其他地方并将其添加到您的路径中,或者将其放入您可以打开的文件中(例如,JSON 配置文件)。

于 2012-12-30T00:04:12.337 回答
1

您应该将其设为db.py配置文件并使用configparser加载它。或者您可以将其存储为 JSON 文件并使用json加载,或者将其存储为 YAML 并使用PyYAML加载。

于 2012-12-30T00:07:31.560 回答
0

我在Python 参考中找到了正式的答案。

from表格是:

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

或者

"from" module "import" "*"

在第一种形式中,点与“隐藏包”的错误概念无关,它指的是相对导入(如 Thomas Orozco 所述)。在第二种形式中,模块定义如下:

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

并且标识符必须以字母开头

正如您所建议的,我将使用外部配置文件,而不是 Python 代码。

于 2012-12-30T00:14:39.343 回答