When developing a non-trivial end-user desktop application in Python, it’s essential to have a well-organized project structure. A good structure makes maintenance easier, is friendly to Integrated Development Environments (IDEs), and facilitates source control branching and merging, as well as the generation of install packages.
Project Structure Overview
A typical Python project should include several key directories and files:
- Top-level directory: This is the root directory of your project. It’s a good practice to name it after your project.
bin/
orscripts/
directory: This directory contains executable scripts that serve as entry points for your application.- Package directory: This directory holds the actual Python package and should be named after your project. Inside this directory, you can have subdirectories for different modules or components of your application.
tests/
directory: This directory contains unit tests and acceptance tests for your application. It’s common to place it inside the package directory or as a separate top-level directory.docs/
directory: This directory stores project documentation, such as user manuals, API documentation, and installation guides.setup.py
file: This file contains setup instructions for your project, including metadata like the project name, version, and dependencies.
Detailed Project Structure
Here’s a more detailed example of a Python project structure:
myproject/
|-- bin/
| |-- myproject
|
|-- myproject/
| |-- __init__.py
| |-- main.py
| |-- utils/
| | |-- __init__.py
| | |-- helper.py
| |
| |-- tests/
| |-- __init__.py
| |-- test_main.py
|
|-- docs/
| |-- conf.py
| |-- generated
| |-- index.rst
| |-- installation.rst
| |-- modules.rst
| |-- quickstart.rst
| |-- myproject.rst
|
|-- requirements.txt
|-- setup.py
|-- README.md
|-- LICENSE
Best Practices
When structuring your Python project, keep the following best practices in mind:
- Avoid using a
src/
orlib/
directory as the top-level package directory. Instead, use the project name directly. - Keep tests inside the package directory to make it easier to run them against an installed version of the application.
- Use a consistent naming convention for your directories and files.
- Keep the top-level directory clean by avoiding clutter with too many files or subdirectories.
Example Code
Here’s an example of how you can structure a simple Python package using the above guidelines:
# myproject/__init__.py
from .main import main
def hello_world():
print("Hello, World!")
# myproject/main.py
def main():
print("My Project Main Function")
if __name__ == "__main__":
main()
# myproject/tests/test_main.py
import unittest
from myproject.main import main
class TestMainFunction(unittest.TestCase):
def test_main(self):
# Test the main function
pass
if __name__ == "__main__":
unittest.main()
By following these guidelines and best practices, you can create a well-structured Python project that is easy to maintain, scalable, and friendly to IDEs and source control systems.