2009-12-01 8 views
27

が含まれています、私はジャンゴを使用していると私はmodels.admin.pyという名前のファイルを持っていると私はmodels.pyで、次のアイデアをしたいときのpythonパッケージを参照するために:どのようにファイル名が期間

from "models.admin" import * 

しかし、私は二重引用符を持つための構文エラーを取得します。私はちょうど私が取得、その後

from models.admin import * 

しない場合でも、「はImportErrorを:いいえモジュールの名前admin」を

はPythonのファイル(つまり、その名前にピリオドを持っている)からインポートする方法はありますか?

+7

HELLO HELLO何が**あなたがmodels.admin.pyのようなファイル名を持つことを強制しますか?なぜそれをmodels_admin.pyまたはmodels/adminと呼んでください。pyやその他のものはDjangoに適合していますか? –

+7

しないでください。 –

+1

技術的には、それはパッケージではなくモジュールです。 – Cerin

答えて

23

実際には、という名前の無効なモジュールをインポートできます。しかし、それにはimpを使用する必要があります。ファイルがmodels.admin.py命名されたと仮定すると、あなたは

import imp 
with open('models.admin.py', 'rb') as fp: 
    models_admin = imp.load_module(
     'models_admin', fp, 'models.admin.py', 
     ('.py', 'rb', imp.PY_SOURCE) 
    ) 

を行うしかし、あなたがそれを使用して開始する前にimp.find_moduleimp.load_module上のドキュメントを読むことができました。

+3

悪い練習ですか? 'imp'は' import'と '__import__'の背後にあるメカニズムです。柔軟性は増しますが、より多くのコードが必要になります。しかし、それについて魔法のようなものはありません。 –

+5

マシンコードはすべての背後にあるメカニズムです。柔軟性が増し、どこに行くのか見てみる? :) – shylent

+1

あなたは本当にそれを使用する必要がある場合は明らかに二度考える必要がありますが、私はそれを使用してどのようにひどく間違って表示されません。 ;)そしてそれは生産で使用されています。 Trac - http://trac.edgewall.org/browser/trunk/trac/loader.py –

4

ファイル名はmodels/admin.pyです。 (Source

つまり、という名前のディレクトリにadmin.pyという名前を付ける必要があります。

次に、from models.admin import *を使用してインポートすることができます。これはPythonパスにあるものとします。

2

名前にピリオド(または疑問符、感嘆符など)が含まれていると、Pythonファイルをモジュールとしてインポートできません。 Pythonモジュールの名前(.pyを含まない)は、有効なPython名でなければなりません(つまり、変数名として使用できます)。

+0

これに便利なリファレンスがありますか? – Taras

+2

参照はPython文法仕様(https://docs.python.org/2/reference/grammar.html)です。しかし、これは実際にはimport文に許可されているものだけを指定します - 上記のように、受け入れられた答えで指摘されているように、基本的なインポートメカニズムを使用してこれを回避することは技術的に可能です。 –

0

あなたはimport文でファイルを参照していない、あなたはモジュールパッケージを参照しています。

docsを読んでください、それらは非常に明確です。

とにかく、あなたがdjangoを使用しているので、通常の方法は動作しません。モデルをmodels.pyではなく別々のファイルに保存する場合は、例えばhereのように、追加の手順を実行する必要があります。

編集:
質問者が管理者に言及したときに、質問者がdjangoの管理インターフェースに関係しているかどうかはわかりません。私のポイントはまだ立つ。

+1

モジュールはファイルです。あなたが参照したドキュメントを引用するには: 'これをサポートするために、Pythonは定義をファイルに入れてスクリプトやインタプリタのインタラクティブなインスタンスで使用する方法を持っています。そのようなファイルはモジュールと呼ばれ、 ' –

10

あなた本当にはIMPモジュールを使用して、あなたは珍しいファイル名でモジュールをインポートすることができますしたい場合(例えば、含むファイル名「の.py」の前に「を。」):

>>> import imp 
>>> a_b = imp.load_source('a.b', 'a.b.py') 
>>> a_b.x 
"I was defined in a.b.py!" 

しかし、それは一般に悪い考えです。パッケージを使用しようとしている可能性が高くなります。その場合は、 "b.py"という名前のファイルを含む "a"という名前のディレクトリを作成する必要があります。 "import a.b"は/ b.pyをロードします。

+1

' load_source'は少なくとも1.5以降は時代遅れです。 –

+0

真ではありませんが、これを行う古くからの方法は、かなり細めです。a_b = imp.load_module( 'a.b'、open( 'abpy')、os.path.abspath( 'abpy')、 ( '.py'、 'r'、imp.PY_SOURCE)) –

関連する問題