我使用Django和我有一個models.admin.py文件命名,我想做到以下幾點想法models.py:如何引用Python包時,文件名中包含一段
from "models.admin" import *
然而,雙引號引起的語法錯誤。但是,如果我只是做
from models.admin import *
然後我得到「導入錯誤:沒有模塊名爲admin」
有沒有辦法從一個Python文件(其名稱中有一段)導入?
我使用Django和我有一個models.admin.py文件命名,我想做到以下幾點想法models.py:如何引用Python包時,文件名中包含一段
from "models.admin" import *
然而,雙引號引起的語法錯誤。但是,如果我只是做
from models.admin import *
然後我得到「導入錯誤:沒有模塊名爲admin」
有沒有辦法從一個Python文件(其名稱中有一段)導入?
其實,你可以用導入一個無效名稱的模塊。但是,您需要使用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_module
和imp.load_module
的文檔你開始使用它之前。
不良做法? 'imp'是'import'和'__import__'背後的機制。更大的靈活性,但需要更多的代碼。儘管如此,沒有什麼神奇的。 – 2009-12-01 19:33:40
機器碼是一切背後的機制。更多的靈活性和..看看我要去哪裏? :) – shylent 2009-12-01 19:36:49
如果你真的需要使用它,你顯然需要考慮一下,但我不明白如何使用它是非常錯誤的。 ;)它用於生產 - 參見例如Trac - http://trac.edgewall.org/browser/trunk/trac/loader.py。 – 2009-12-01 19:42:07
該文件被稱爲models/admin.py
。 (Source)
也就是說,它應該在名爲models
的目錄中調用admin.py
。
然後,您可以使用from models.admin import *
導入,假設它位於您的Python路徑中。
不,您不能將python文件作爲模塊導入,如果它的名稱包含句號(或問號或感嘆號等)。一個python模塊的名字(不包括.py)必須是一個有效的python名字(即可以用作變量名)。
你有這方面的參考嗎? – Taras 2014-07-03 05:54:12
該引用是Python語法規範(https://docs.python.org/2/reference/grammar.html)。但是,這實際上只指定了允許導入語句的內容 - 正如上面在接受的答案中指出的那樣,通過使用基礎導入機制來解決此問題在技術上是可行的。 – 2014-07-04 07:12:00
如果你真的想來,你可以導入一個模塊,一個不尋常的文件名(例如,「的.py」之前包含一個文件名「」)使用小鬼模塊:
>>> import imp
>>> a_b = imp.load_source('a.b', 'a.b.py')
>>> a_b.x
"I was defined in a.b.py!"
但是,這通常是一個壞主意。更有可能是你試圖使用包,在這種情況下,你應該創建一個名爲「a」的目錄,其中包含一個名爲「b.py」的文件;然後「導入a.b」將加載a/b.py。
'load_source'已經過時,因爲至少1.5。 – 2009-12-01 19:21:37
確實如此,儘管這樣做的方式非常複雜:a_b = imp.load_module('a.b',open('abpy'),os.path.abspath('abpy'), ('.py','r',imp.PY_SOURCE)) – 2009-12-01 20:41:41
HELLO HELLO什麼是**強制**你有一個文件名像models.admin.py ??爲什麼不把它稱爲models_admin.py或models/admin。py或者其他適合Django的東西? – 2009-12-01 20:47:32
請不要這樣做。 – 2009-12-01 20:57:42
從技術上講,這是一個模塊,而不是一個包。 – Cerin 2013-05-01 15:10:14