2011-03-01 73 views
59

Tôi mới sử dụng Python và tôi đang bắt đầu một Dự án nhỏ. nhưng tôi có một số nghi ngờ về cách tổ chức các thư mục trong "Python Way".Làm thế nào để tổ chức một dự án Python?

Tôi đang sử dụng PyDev trong môi trường phát triển của tôi, và khi tôi tạo một dự án mới một thư mục được tạo ra gọi là "src"

+ src 

Bây giờ, trong PyDev tôi có thể tạo ra "Pydev Module" và " PyDev Package"

tôi cần phải tổ chức dự án của tôi theo cách sau:

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

Làm thế nào tôi có thể tổ chức này về Modules và gói? Ý nghĩa của module và gói là gì?

Best Regards,

+0

tôi có thể khuyên [này] (http://docs.python.org/2/ hướng dẫn/modules.html) liên kết, trong [Hướng dẫn Python chính thức] (http://docs.python.org/2/tutorial/modules.html). Nó khá rõ ràng và thẳng thắn. – LiorK

+0

Một bài đăng rất hữu ích gần đây: [Bắt đầu một dự án python đúng cách] (http://www.jeffknupp.com/blog/2014/02/04/starting-a-python-project-the-right-way/) – karlcow

Trả lời

38

Một gói cơ bản là một thư mục với tập tin __init__.py dưới nó và thường một số module, nơi Module là một tập tin *.py. Nó phải làm với import chủ yếu. Nếu bạn thêm __init__.py để chỉ số bạn có thể sử dụng:

from Indicators.Stochastics import * 

hoặc

from Indicators import Stochastics 

Bằng cách này, tôi muốn giới thiệu để giữ tên mô-đun/gói thành chữ thường. Nó không ảnh hưởng đến chức năng nhưng nó còn "pythonic" hơn.

33

Từ góc độ hệ thống tệp, mô-đun là tệp kết thúc bằng .py và gói là thư mục chứa các mô đun và gói (lồng nhau) một lần nữa. Python nhận dạng một thư mục dưới dạng gói nếu nó chứa tệp __init__.py.

Một cấu trúc tập tin như thế

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

xác định gói some, trong đó có một mô-đun foofoo và một gói lồng nhau thing, mà lại có một mô-đun barbar. Tuy nhiên, khi sử dụng các gói và các module, bạn không thực sự phân biệt hai loại:

import some 

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

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

Hãy làm theo PEP8 khi lựa chọn đặt tên cho gói của bạn/modules (ví dụ: sử dụng tên thấp hơn hợp cụ thể).

+2

Tôi có thể gọi hàm từ 'foofoo.py' nếu tôi chỉ nhập một số? Tôi bối rối về '__init __. Py', tôi nên đặt gì ở đó? –

4

Gói là thư mục có số __init__.py trong đó. Sự khác biệt từ một thư mục là bạn có thể nhập nó.

Không có cách "Python", nhưng bạn sẽ thấy rằng bạn nên đặt tất cả các mô-đun của mình vào một gói có tên liên quan đến dự án.

Ngoài ra, để làm theo hướng dẫn kiểu Python, PEP8, tên gói và mô-đun phải là chữ thường.Vì vậy, nếu chúng ta giả định dự án được gọi là "Botond kê" cấu trúc của bạn sẽ là một cái gì đó như thế này:

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

Sau đó, bạn sẽ tìm thấy những lớp Stochastics bằng cách làm

from botondstats.indicators.stochastics.Stochastics 

(Có nhiều cách khác nhau để giữ cấu trúc nhưng làm cho nhập khẩu ngắn hơn, nhưng đó là một câu hỏi khác).

Bạn có thể đặt cấu trúc này dưới src/ nếu bạn muốn, nhưng không cần thiết. Tôi chưa bao giờ làm. Thay vào đó tôi có một thư mục chính:

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

Trong thư mục này, tôi cũng thường có một virtualenv vì vậy tôi thực sự cũng có bin/lib/et al. Việc phát triển thường được thực hiện bằng cách chạy

./bin/python setup.py tests 

Khi tôi sử dụng trình kiểm tra Distrubute để chạy thử nghiệm.

Đó là cách tôi thực hiện. :-)

13

Bạn có thể muốn xem thư viện mẫu hiện đại. Nó cung cấp một cách để thiết lập một bố trí cơ bản thực sự tốt đẹp cho một dự án mà bạn đi qua một vài câu hỏi và cố gắng giúp bạn có được một cái gì đó có thể được phân phối khá dễ dàng.

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

25

Xem python-package-template

Cấu trúc thư mục

. 
    |-- 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 

mèo 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

hi, Vitaly! Tôi đã đi qua dự án của bạn. Bạn vẫn đang duy trì nó? Cảm ơn! – elias

+2

Đã kết thúc bằng 404 –

6

Trước khi quyết định một cấu trúc dự án, rất tốt để tự hỏi mình những gì mục đích của dự án là sẽ được. Đây có phải là một phân tích không? Một khái niệm đồ chơi bạn muốn điều tra? Một dự án đầy đủ thổi bạn dự định sẽ phân phối? Số lượng nỗ lực bạn muốn đưa vào cơ cấu dự án của bạn sẽ khác nhau.

  • Nếu đó là phân tích một lần, tôi thích sử dụng ipython notebooks. Sổ ghi chép sẽ ghi lại luồng suy nghĩ của bạn và bạn có thể thêm ghi chú trong đánh dấu vào mã của mình để tham khảo sau này.
  • Nếu đó là một khái niệm đồ chơi bạn muốn điều tra, tôi thấy một cách tiếp cận đơn giản, nhanh chóng để hoạt động tốt nhất. Bạn muốn có thể nhanh chóng triển khai khái niệm của mình để khám phá xem nó có khả thi hay không và do đó đáng để dành nhiều thời gian hơn cho nó. Một phần triết lý của Python là 'Đừng cố gắng hoàn hảo bởi vì “đủ tốt” thường là như vậy ”. Bạn luôn có thể quay lại sau và cấu trúc dự án của bạn theo cách thực hiện theo các phương pháp kỹ thuật phần mềm tốt nhất.
  • Nếu bạn muốn cấu trúc dự án của bạn, do đó bạn sau này có thể phân phối nó, và do đó nó quy mô với nhiều module Tôi khuyên bạn nên cấu trúc sau:

    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 
    

Những lý do cụ thể tại sao tôi thích cấu trúc này are in my blog post, nhưng ý chính cơ bản là thư mục projectname có cấp bậc thấp hơn chứa dự án thực tế của bạn. Cùng với đó là tất cả các công cụ giúp quản lý (git) và gói (setup.py, MANIFEST.in).

Các vấn đề liên quan