2009-12-01 82 views
27

我使用Django和我有一個models.admin.py文件命名,我想做到以下幾點想法models.py:如何引用Python包時,文件名中包含一段

from "models.admin" import * 

然而,雙引號引起的語法錯誤。但是,如果我只是做

from models.admin import * 

然後我得到「導入錯誤:沒有模塊名爲admin」

有沒有辦法從一個Python文件(其名稱中有一段)導入?

+7

HELLO HELLO什麼是**強制**你有一個文件名像models.admin.py ??爲什麼不把它稱爲models_admin.py或models/admin。py或者其他適合Django的東西? – 2009-12-01 20:47:32

+7

請不要這樣做。 – 2009-12-01 20:57:42

+1

從技術上講,這是一個模塊,而不是一個包。 – Cerin 2013-05-01 15:10:14

回答

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__'背後的機制。更大的靈活性,但需要更多的代碼。儘管如此,沒有什麼神奇的。 – 2009-12-01 19:33:40

+5

機器碼是一切背後的機制。更多的靈活性和..看看我要去哪裏? :) – shylent 2009-12-01 19:36:49

+1

如果你真的需要使用它,你顯然需要考慮一下,但我不明白如何使用它是非常錯誤的。 ;)它用於生產 - 參見例如Trac - http://trac.edgewall.org/browser/trunk/trac/loader.py。 – 2009-12-01 19:42:07

4

該文件被稱爲models/admin.py。 (Source

也就是說,它應該在名爲models的目錄中調用admin.py

然後,您可以使用from models.admin import *導入,假設它位於您的Python路徑中。

2

不,您不能將python文件作爲模塊導入,如果它的名稱包含句號(或問號或感嘆號等)。一個python模塊的名字(不包括.py)必須是一個有效的python名字(即可以用作變量名)。

+0

你有這方面的參考嗎? – Taras 2014-07-03 05:54:12

+2

該引用是Python語法規範(https://docs.python.org/2/reference/grammar.html)。但是,這實際上只指定了允許導入語句的內容 - 正如上面在接受的答案中指出的那樣,通過使用基礎導入機制來解決此問題在技術上是可行的。 – 2014-07-04 07:12:00

0

你是不是引用文件在import語句,您引用模塊

請閱讀docs,他們對此非常清楚。

無論如何,由於您使用的是django,通常的方法將無法正常工作。如果要將模型保存在單獨的文件中而不是models.py中,則必須採取額外的步驟,例如here

編輯:
那麼,我不知道問題的意思,當他提到管理員和它是否與django的管理界面有關。我的觀點依然存在。

+1

模塊是一個文件。引用你引用的文檔:「爲了支持這個,Python有一種方法可以將定義放在一個文件中,並將它們用在腳本或解釋器的交互式實例中。這樣的文件被稱爲模塊;' – 2013-05-01 21:41:22

10

如果你真的來,你可以導入一個模塊,一個不尋常的文件名(例如,「的.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。

+1

'load_source'已經過時,因爲至少1.5。 – 2009-12-01 19:21:37

+0

確實如此,儘管這樣做的方式非常複雜:a_b = imp.load_module('a.b',open('abpy'),os.path.abspath('abpy'), ('.py','r',imp.PY_SOURCE)) – 2009-12-01 20:41:41

相關問題