2014-02-06 51 views
0

使用項目結構時遇到問題,如下所示:What is the best project structure for a Python application?在模塊「x」中導入軟件包「x」:防止導入自己並導入軟件包

想象一下,一個項目佈局是這樣的:

Project/ 
|-- bin/ 
| |-- project.py 
| 
|-- project/ 
| |-- __init__.py 
| |-- foo.py 

斌/ project.py我想從包項目進口。

#project.py 
from project import foo 

由於sys.path中[0]總是項目/ bin中運行倉/ project.py時,它會嘗試導入模塊倉/ project.py(本身),從而導致在屬性錯誤。有沒有辦法使用此項目佈局,而不需要在模塊bin/project.py中使用sys.path?我基本上需要一個「importpackage」語句,它忽略了具有相同名稱的模塊。

由於項目結構的建議,我不知道爲什麼沒有人有這樣那樣的問題......

+0

不要從該目錄運行呢? – user2357112

+0

正如我所說,我不想改變項目結構,因爲它似乎是「標準」佈局 – S1lentSt0rm

回答

1

你可以嘗試:

import imp 
module_name = imp.load_source('project','../project') 

MODULE_NAME將包。

編輯:

對於Python 3.3+

import importlib.machinery 

loader = importlib.machinery.SourceFileLoader("project", "../project") 
foo = loader.load_module("project") 

Source

+0

我實際上使用python 3.3,python 3.3中的模塊imp沒有方法load_source – S1lentSt0rm

+0

添加了3.3+等效。 – XrXrXr

+0

感謝您的回覆。我希望有一些「importpackage」語句,明確地只加載包並跳過單個文件模塊以避免導入自己。你這樣做的方式可能是一個解決方案(即使我得到一些奇怪的操作系統權限錯誤),但我想避免使用相對路徑。我看到使用上面的例子沒有太大的好處,而不是「sys.path.append(sys.path.pop(0))」。 – S1lentSt0rm