我最近将一个Django项目从sqlite3切换到postgres。我想从放在隐藏目录中的模块中读取db密码。
.secrets
__init__.py
db.py # DB_PASSWORD = 'mypassword'
如何从隐藏的.secrets目录中的db模块导入DB_PASSWORD?以下不起作用(ImportError):
from .secrets.db import DB_PASSWORD
我是否必须使用__import__
技巧?对于代码样式约定,我更喜欢使用from / import模式。
答案 0 :(得分:4)
从PEP 328,http://www.python.org/dev/peps/pep-0328/#rationale-for-relative-imports你实际上应该避免命名一个以" dot" 开头的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 :(得分:2)
在Python中,from .module import something
语法为for relative imports。
因此,如果您尝试在包名称中使用前导点,Python将会混淆并尝试相对导入,这将失败。
在相关的说明中,import .module
实际上是SyntaxError
我认为这不是那么糟糕。只需将您的秘密存储在其他地方,然后将其添加到您的路径中,或者将其放在您可以打开的文件中(例如,JSON配置文件)。
答案 2 :(得分:1)
您应该将db.py
配置文件并使用configparser加载它。或者您可以将其存储为JSON文件并使用json加载,或将其存储为YAML并使用PyYAML加载。
答案 3 :(得分:0)
我在Python reference找到了正式答案。
from
表格是:
"from" relative_module "import" identifier ["as" name] ( "," identifier ["as" name] )*
或
"from" module "import" "*"
在第一种形式中,点与“隐藏包”的错误概念无关,它指的是相对进口(如Thomas Orozco所述)。在第二种形式中,模块定义如下:
module ::= (identifier ".")* identifier
正如您所建议的那样,我将使用外部配置文件,而不是Python代码。