从隐藏目录(包)导入模块

Pao*_*olo 2 python import hidden module

我最近将Django项目从sqlite3切换到了postgres。我想从隐藏目录中的模块读取db密码。

.secrets
    __init__.py
    db.py # DB_PASSWORD = 'mypassword'
Run Code Online (Sandbox Code Playgroud)

如何从隐藏在.secrets目录中的db模块中导入DB_PASSWORD?以下无效(ImportError):

from .secrets.db import DB_PASSWORD
Run Code Online (Sandbox Code Playgroud)

我必须使用__import__技巧吗?对于代码样式约定,我希望保留from / import模式。

Cal*_*eng 5

从PEP 328,http: //www.python.org/dev/peps/pep-0328/#rationale-for-relative-imports中,您实际上应该避免命名以“点”开头的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))  
Run Code Online (Sandbox Code Playgroud)

因此,对于要从中加载值的用例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.
Run Code Online (Sandbox Code Playgroud)

虽然不会建议。