2012-01-12 67 views
1

包裝蟒蛇我通過前面的問題,這個效果看,但我的情況略有不同...圓形進口

我有一個包含進口彼此在這裏和那裏必要幾個Python類目錄。我想開始將它們打包成更小的模塊,主要是爲了組織目的。該軟件包的核心組件設置了一個wsgi應用程序,然後額外的模塊爲其提供了功能(迄今爲止,該功能運行良好,因爲我可以在命令行上單獨測試這些mod,然後將其輸入連接到Web應用程序。)

我瞭解如何提供__init__.py模塊,其命名空間以及何時釋放控制權。我遇到的問題是某些情況下的模塊相互導入。

例如,我有一個JSONEncoder,用作cls參數,用於json.dumps()的許多調用。這個類實際上用於每個文件。如果我將這些模塊中的某些模塊移動到程序包中的子目錄中,我將如何去「導入一個級別」來導入json編碼器?我需要將父目錄放在每個文件的PYTHONPATH中嗎?編碼器自己的目錄以及單獨的__init__.py文件會更好嗎?

另外,我是否最好放入一個函數來鑽取當前工作目錄下的所有目錄,並將它們添加到路徑中?

目前包含所有代碼的主目錄本身沒有打包......考慮到它們具有循環導入,將類像類遷移到子目錄的最佳方法是什麼?

編輯:

對於澄清:

我一直在開發的主要工作目錄只是包含大約十.py文件,它們都含有與像它們的文件名的名字班定期目錄。目前整個事情只是.py文件的git repo。

-project 
    search.py 
    jsonencoder.py 
    webapp.py 
    modela.py 
    modelb.py 
    modelc.py 

名稱當然是例如目的。

現在據我所知(這可能是完全錯誤的)明智的做法是將這些模型打包在一起,對嗎?

-project 
    search.py 
    jsonencoder.py 
    webapp.py 
    -models 
    __init__.py 
    modela.py 
    modelb.py 
    modelc.py 

但後來反過來又會在project文件夾需要一個__init__嗎?使用jsonencoder的modela將如何導入它?

+0

「我有一個包含多個python類的目錄「。這不明智。目錄包含文件。目錄也可以是Python包。文件是模塊。模塊包含類定義。你能澄清你的問題嗎? – 2012-01-12 20:22:51

+0

@ S.Lott編輯示例 – DeaconDesperado 2012-01-12 20:33:40

回答

1

答案很簡單:

只需要使用完全合格的名稱,你需要

例如,子模塊,在

mybundle/test/__init__.py 

你可以有行

import mybundle.JSONEncoder 
  • 它會做j最好的東西。

例如,假設該模塊結構:

├── mybundle 
│   ├── __init__.py 
│   ├── jsonencoder 
│   │   ├── __init__.py 
│   └── test 
│    ├── __init__.py 

與定義爲文件:

[[email protected] tmp]$ cat mybundle/__init__.py 
import test 

[[email protected] tmp]$ cat mybundle/test/__init__.py 
import mybundle.jsonencoder 

[[email protected] tmp]$ cat mybundle/jsonencoder/__init__.py 
print 5 

這工作:

[[email protected] tmp]$ python 
Python 2.7.1 (r271:86832, Apr 12 2011, 16:15:16) 
[GCC 4.6.0 20110331 (Red Hat 4.6.0-2)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import mybundle 
5 
>>> 
+0

因此,關鍵的是在根中也有一個__init__.py,它也會冒泡到子模塊並執行它們的init腳本。測試子目錄中的init如何知道mybundle在哪裏? – DeaconDesperado 2012-01-12 20:37:32

+0

是的,在根上有一個'__init __。py'是至關重要的 - 它可以是空的(0字節)。創建一個空的'__init __。py'會使Python將該目錄視爲一個模塊,並將包含'__init __。py'文件的其他目錄視爲該子目錄的子模塊。從此,使用進口只是工作,如果可以在任何應用程序中找到。 (並且只是您的根目錄的名稱) – jsbueno 2012-01-12 23:31:33

0

你可以嘗試這樣的事情(root是你的工作目錄):

/root 
    - file_a.py 
    - file_b.py 
    /JSONEncoder 
    - __init__.py 
    - JSONEncoder.py 

__init__.py是空白的,或者具有pass評論或東西。 然後,您可以做(從file_a.py或任何在root):

from JSONEncoder import JSONEncoder 

,並在file_a.py訪問JSONEncoder。只要您的所有運行代碼位於/root__init__.py只需要在子目錄中,則不需要觸摸PYTHONPATH。這種類型的目錄佈局非常有用,因爲您可以隱藏「正常工作」的代碼並專注於您需要處理的代碼。