【问题标题】:Import a module from hidden directory (package)从隐藏目录(包)导入模块
【发布时间】:2012-12-29 23:51:33
【问题描述】:

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

【问题讨论】:

    标签: python import module hidden


    【解决方案1】:

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

    虽然不建议。

    【讨论】:

      【解决方案2】:

      在 Python 中,from .module import something 语法为 for relative imports

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

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


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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我在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 代码。

          【讨论】:

            猜你喜欢
            • 2015-12-22
            • 2017-08-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-19
            • 2019-10-30
            • 2021-03-09
            相关资源
            最近更新 更多