2011-03-01 78 views
59

我是新來的Python,我開始一個小型項目。但是我對如何在「Python方式」中組織文件夾存在一些疑問。如何組織一個Python項目?

我在我的開發環境中使用的PyDev,當我創建一個新的項目中創建一個文件夾名爲「SRC」現在

+ src 

,在我的PyDev可以創造出「PyDev模塊」和「 PyDev的包」

我需要整理我的項目下列方式:

+ Indicators 
    - Moving_averages.py 
    - Stochastics.py 
+ Strategies 
    - Moving_averages_cross.py 
- example.py 

我如何在模塊和包方面的組織呢?模塊和包的含義是什麼?

此致

+0

我可以推薦[此](http://docs.python.org/2/ tutorial/modules.html)鏈接,出[官方Python教程](http://docs.python.org/2/tutorial/modules.html)。這是非常清楚和直截了當的。 – LiorK

+0

最近很有幫助的帖子:[以正確的方式啓動python項目](http://www.jeffknupp.com/blog/2014/02/04/starting-a-python-project-the-right-way/) – karlcow

回答

38

A包裝基本上是與在它之下__init__.py文件和通常一些模塊,其中模塊是一個*.py文件的文件夾。 主要與import有關。如果添加__init__.py到指標,你可以使用:

from Indicators.Stochastics import * 

from Indicators import Stochastics 

順便說一句,我會建議保持小寫模塊/包名。它不影響功能,但更「pythonic」。

33

從文件系統角度來看,一個模塊是一個以.py結尾的文件,一個包是一個包含模塊和(嵌套)包的文件夾。如果Python包含__init__.py文件,Python會將其識別爲包。

那樣

some/ 
    __init__.py 
    foofoo.py 
    thing/ 
     __init__.py 
     barbar.py 

的文件結構定義了包some,其具有模塊foofoo和一個嵌套包thing,這又具有模塊barbar。但是,使用包和模塊的時候,你真的不區分這兩種類型:

import some 

some.dothis() # dothis is defined in 'some/__init__.py' 

import some.foofoo # <- module 
import some.thing # <- package 

請按照PEP8選擇命名您的包時/模塊(即使用小寫的名字)。

+2

如果我只導入一些,我可以從'foofoo.py'調用函數嗎?我對'__init __。py'感到困惑,應該在那裏放什麼? –

4

包是一個其中包含__init__.py的目錄。與目錄的不同之處在於您可以導入它。

本身並沒有「Python方式」,但是您會發現將所有模塊放在一個包中,其名稱與項目相關是個好主意。

此外,要遵循Python風格指南PEP8,包和模塊名稱應全部爲小寫。所以,如果我們假設該項目被稱爲「Botond統計」你的結構是這樣的:

botondstats/ 
    indicators/ 
     moving_averages.py 
     stochastics.py 
    strategies/ 
     moving_averages_cross.py 
    example.py 

你可以這樣做

from botondstats.indicators.stochastics.Stochastics 

找到隨機指標類(有多種方式來保持結構,但使進口更短,但這是另一個問題)。

如果您願意,您可以將此結構置於src/之下,但這不是必需的。我從來沒有做。 相反,我有一個主目錄:

BotondStatistics/ 
    docs/ 
    botonstats/ # the above structure 
    setup.py # Distutils/distribute configuration for packaging. 

在這個目錄通常我也有一個這樣的virtualenv我其實也有斌/ lib中/等。開發通常通過運行完成

./bin/python setup.py tests 

當我使用Distrubute測試運行器來運行測試。

這就是我如何做到的。 :-)

13

您可能想要查看modern-package-template庫。它提供了一種爲項目設置一個非常好的基本佈局的方法,它可以引導您解答幾個問題,並嘗試幫助您獲得可以輕鬆分發的內容。

http://pypi.python.org/pypi/modern-package-template

25

python-package-template

目錄結構

. 
    |-- bin 
    | `-- my_program 
    |-- docs 
    | `-- doc.txt 
    |-- my_program 
    | |-- data 
    | | `-- some_data.html 
    | |-- __init__.py 
    | |-- submodule 
    | | `-- __init__.py 
    | |-- helpers.py 
    |-- tests 
    | |-- __init__.py 
    | |-- test_helpers.py 
    |-- Makefile 
    |-- CHANGES.txt 
    |-- LICENSE.txt 
    |-- README.md 
    |-- requirements-dev.txt 
    |-- requirements.txt 
    `-- setup.py 

的Makefile

PYTHON=`which python` 
    NAME=`python setup.py --name` 


    all: check test source deb 

    init: 
     pip install -r requirements.txt --use-mirrors 

    dist: source deb 

    source: 
     $(PYTHON) setup.py sdist 

    deb: 
     $(PYTHON) setup.py --command-packages=stdeb.command bdist_deb 

    rpm: 
     $(PYTHON) setup.py bdist_rpm --post-install=rpm/postinstall --pre-uninstall=rpm/preuninstall 

    test: 
     unit2 discover -s tests -t . 
     python -mpytest weasyprint 

    check: 
     find . -name \*.py | grep -v "^test_" | xargs pylint --errors-only --reports=n 
     # pep8 
     # pyntch 
     # pyflakes 
     # pychecker 
     # pymetrics 

    clean: 
     $(PYTHON) setup.py clean 
     rm -rf build/ MANIFEST dist build my_program.egg-info deb_dist 
     find . -name '*.pyc' -delete 
+2

嗨,維塔利!我剛剛遇到你的項目。你還在維護它嗎?謝謝! – elias

+2

結束了404 –

6

在決定上一個項目結構,這是很好的問自己這個項目的目的將是。這是否會成爲一次分析?你想調查的玩具概念?你打算分發一個完整的項目?您想要構建項目的努力量會有所不同。

  • 如果是一次性分析,我喜歡用ipython notebooks。筆記本將捕獲您想法的流程,並且您可以將標記中的註釋添加到代碼中供以後參考。
  • 如果這是一個你想研究的玩具概念,我發現一個簡單,快速的方法來最好地工作。您希望能夠快速實施您的概念,以發現它是否可行,因此值得花費更多時間。 Python的哲學的一部分是'不要爲完美而努力,因爲「夠好」往往就是這樣。您可以隨時回來,並按照最佳軟件工程實踐的方式構建您的項目。
  • 如果你想構建你的項目,所以你可以在以後發佈它,所以它擴展到許多模塊我推薦以下結構:

    projectname 
    ├── MANIFEST.in 
    ├── setup.py 
    ├── README 
    ├── .gitignore 
    ├── .git 
    ├── projectname_env 
    └── projectname 
        ├── __init__.py 
        ├── subpackageone 
        │ ├── __init__.py 
        │ ├── second_module.py 
        │ ├── tests 
        │ │ └── test_second_module.py 
        │ └── models 
        │  └── model1 
        ├── first_module.py 
        └── tests 
         └── test_second_module.py 
    

爲什麼我喜歡這種結構的詳細原因are in my blog post,但基本要點是,層次較低的projectname目錄包含您的實際項目。除此之外,它還包括幫助管理(git)和打包(setup.py,MANIFEST.in)的所有工具。