2012-07-13 118 views
5

我正在嘗試使用python,主要是排除其他人的代碼故障。我試圖讓程序運行,「path\folderA\program.py」。從另一個文件夾導入失敗的Python導入

我從path\folderA

運行的程序,我得到一個錯誤:

ImportError: No module named fff.ggg.ppp 

program.py包含導入:

from fff.ggg.ppp import mmm 

在文件夾 「路徑\ FolderB中」有: 「path\folderB\fff\__init__.py」 「path\folderB\fff\ggg

文件夾ggg還包含__init__.py,以及節目ppp.py

從閱讀其他職位,如Python error "ImportError: No module named"據我所知,具有__init__.py使一個文件夾中的「包」,這使得進口成爲可能 - 但它不」我工作,因爲我得到一個錯誤。

這一直在爲這些項目工作的其他人工作,所以我的設置有問題。

我讀了一些關於必須在sys.path中的目錄。這是否意味着我必須將它們添加到環境變量路徑?這意味着要將大量的目錄添加到PATH中,所以它不能。

所以我還發現了以下內容:

import sys 
sys.path.append(<path to FolderB>) 

但是,這意味着改變的代碼(這還沒有其他人是必要的)和硬編碼到它是我的本地機器上的一個路徑 - 這我不應該,對吧?

我無法想象它 - 顯然我不應該更改代碼並將物理路徑硬編碼到導入模塊 - 那麼folderA的程序如何知道要在folderB中查找導入?

__init__.py的魔法效果如何?

+1

Python在'PYTHONPATH'環境變量中查找,而不是'PATH' – mgilson 2012-07-13 19:01:43

回答

1

I can't visualize it - apparently I am not supposed to change the code and hard-code the physical path to the import module - so how can a program from folderA even know to look in folderB for an import ?

你是對的。不知何故,你必須告訴python在folderB中查找導入的模塊。沒有__init__.py魔術可讓您從硬盤上的其他文件夾導入。

通常,如果你有各種不同的Python包,它們通過安裝到python的庫中來工作。這樣他們可以從任何地方進口。這通常通過setup.py腳本完成。檢查folderB是否有一個。用python setup.py install運行它。

如果這不起作用,我們需要更多關於這個代碼結構的信息。

+0

謝謝,我已經看到了setup.py,但不知道如何使用它。有效 ! – Thalia 2012-07-13 19:30:29

0

文件夾B必須位於sys.path中,因此您需要將mmm移動到A或從A中修改sys.path(不確定是否可行)。 __init__.py告訴python該文件夾是一個包,所以你可以在__init__.py的文件夾內有__init__.py的文件夾,並且python把裏面的文件夾當作父文件夾的一部分。檢查sympy或幾乎任何大型的python庫,你會發現這樣的結構。它也可以包含要在導入時運行的代碼,但也可以爲空。