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

时间:2012-12-29 23:51:33

标签: python import module hidden

我最近将一个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模式。

4 个答案:

答案 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

和标识符must start with a letter

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