3

最近、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

4 に答える 4

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))  

したがって、から値をロードするユースケースでは、次の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が言及)。2番目の形式では、モジュールは次のように定義されます。

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

識別子は文字で始まる必要があります。

あなたが提案したように、私はPythonコードではなく、外部構成ファイルを使用します。

于 2012-12-30T00:14:39.343 に答える