2013-12-19 68 views
1

我想從應用程序特定的終端(在這種情況下,瑪雅人,但最終其他人)導入模塊。我下載了一個項目關閉混帳,我有一個結構,像這樣:模塊導入本身

modulename 
    submodule 
     __init.py__ 
     subsubmodule 
     ... 
    submodule 
    ... 
    __init.py__ 
    modulename.py 
在我執行殼

於是,我試圖導入到外殼上使用的模塊,所以我必須:

import sys,os 
modulepath = 'C:/path/to/module' 
sys.path.append(modulepath) 
import modulename 

如果導入的modulename.py是空白的,一切都很好。 模塊的前兩行,然而,該模塊試圖導入本身(我真的不知道爲什麼,看到這是別人的項目,但它似乎是結構很重要)

import sys,os 
import modulename from modulename as mod 

這得到了錯誤:

# Error: ImportError: cannot import name modulename# 

,並沒有別的可以繼續進行。

最終我想知道爲什麼一個模塊不能導入自己,和/或如何解決這個問題?

我已閱讀,模塊認爲它自己被命名主要使相對進口不工作,在這種情況下,我希望

import __main__ as mod 

來代替它,也沒有工作不,錯誤:

# Error: ImportError: Cannot re-init internal module __main__ # 

這是總的意義。

[現在的問題是,我怎麼能導入模塊從內部本身?]

+0

你嘗試'從MODULENAME進口MODULENAME爲mod'? –

+0

是的,與第一個錯誤相同的ImportError。 –

回答

5

你在這裏什麼是所謂的「模塊名」包包含一個子模塊也稱爲「模塊名」。換句話說,「modulename.modulename」。這在Python中是完全有效的。 modulename.py模塊反過來試圖從包中的其他地方導入一些東西,也稱爲「模塊名」。這就是爲什麼它看起來像它試圖從「本身」導入。誠然混淆這就是爲什麼我平時儘量不使用命名這樣我自己;)

進口不工作,因爲你要添加的頂級所謂的「模塊名」包到sys.path中,當你應該加入父目錄。包裝結構非常重要。

你可以告訴Python項目中的目錄是一個包,因爲它包含一個__init__.py文件。順便說一句,我不知道你要使用什麼軟件,但是如果沒有機會,它會包含一個setup.py文件,你應該使用它來安裝它。

(順便說一句,我不相信原來的文件實際上包含import modulename from modulename as mod因爲這是無效的語法。)

+0

那麼,它是如何建立起來的,但是這個項目本身就是另一種語言的端口,在這個過程中被拋棄了,我試圖恢復它,所以也許有人留下了一些沒有工作的東西。當我試圖分析正在發生的事情並以目錄方式維護當前的項目結構時,對於導入行爲,您會提出什麼樣的語法? –

+0

據我所知,雖然你的答案是全面的,但我似乎無法基於「modulename.modulename」方面導入。我只是得到相同的ImportErrors。 –

+0

嗯,我想我設法使它或多或少的工作,雖然我似乎無法訪問子包。 我會試着獨立解決這個問題,因爲這在技術上是一個不同的問題。謝謝。 –