Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the best project structure for a Python application? [closed]

Imagine that you want to develop a non-trivial end-user desktop (not web) application in Python. What is the best way to structure the project's folder hierarchy?

Desirable features are ease of maintenance, IDE-friendliness, suitability for source control branching/merging, and easy generation of install packages.

In particular:

  1. Where do you put the source?
  2. Where do you put application startup scripts?
  3. Where do you put the IDE project cruft?
  4. Where do you put the unit/acceptance tests?
  5. Where do you put non-Python data such as config files?
  6. Where do you put non-Python sources such as C++ for pyd/so binary extension modules?
like image 579
kbluck Avatar asked Oct 10 '08 21:10

kbluck


2 Answers

Doesn't too much matter. Whatever makes you happy will work. There aren't a lot of silly rules because Python projects can be simple.

  • /scripts or /bin for that kind of command-line interface stuff
  • /tests for your tests
  • /lib for your C-language libraries
  • /doc for most documentation
  • /apidoc for the Epydoc-generated API docs.

And the top-level directory can contain README's, Config's and whatnot.

The hard choice is whether or not to use a /src tree. Python doesn't have a distinction between /src, /lib, and /bin like Java or C has.

Since a top-level /src directory is seen by some as meaningless, your top-level directory can be the top-level architecture of your application.

  • /foo
  • /bar
  • /baz

I recommend putting all of this under the "name-of-my-product" directory. So, if you're writing an application named quux, the directory that contains all this stuff is named /quux.

Another project's PYTHONPATH, then, can include /path/to/quux/foo to reuse the QUUX.foo module.

In my case, since I use Komodo Edit, my IDE cuft is a single .KPF file. I actually put that in the top-level /quux directory, and omit adding it to SVN.

like image 59
S.Lott Avatar answered Oct 01 '22 14:10

S.Lott


According to Jean-Paul Calderone's Filesystem structure of a Python project:

Project/ |-- bin/ |   |-- project | |-- project/ |   |-- test/ |   |   |-- __init__.py |   |   |-- test_main.py |   |    |   |-- __init__.py |   |-- main.py | |-- setup.py |-- README 
like image 23
cmcginty Avatar answered Oct 01 '22 14:10

cmcginty