├── requirments.txt ├── project ├── module │ ├── bar │ │ └── bar.py │ ├── foo │ │ └── foo.py │ └── __init__.py ├── __init__.py └── __main__.py ├── .gitignore ├── entry2.py ├── entry.py ├── readme.md └── Project Name.spec /requirments.txt: -------------------------------------------------------------------------------- 1 | pyinstaller==5.1 -------------------------------------------------------------------------------- /project/module/bar/bar.py: -------------------------------------------------------------------------------- 1 | class Bar: 2 | pass -------------------------------------------------------------------------------- /project/module/foo/foo.py: -------------------------------------------------------------------------------- 1 | class Foo: 2 | pass -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *__pycache__ 2 | .venv 3 | .vscode 4 | build 5 | dist -------------------------------------------------------------------------------- /project/module/__init__.py: -------------------------------------------------------------------------------- 1 | from .bar.bar import Bar 2 | from .foo.foo import Foo -------------------------------------------------------------------------------- /entry2.py: -------------------------------------------------------------------------------- 1 | from project import __main__ 2 | 3 | print("Called from entry2.py") 4 | 5 | __main__.main() -------------------------------------------------------------------------------- /entry.py: -------------------------------------------------------------------------------- 1 | from project import Project 2 | 3 | print("Called from entry.py") 4 | 5 | p = Project() 6 | p.main() -------------------------------------------------------------------------------- /project/__init__.py: -------------------------------------------------------------------------------- 1 | from . import module 2 | 3 | print("Called from __init__.py") 4 | 5 | class Project: 6 | def main(self): 7 | print(f'this is main {self}') 8 | b = module.Bar() 9 | print(f'this is bar {b}') 10 | 11 | pass -------------------------------------------------------------------------------- /project/__main__.py: -------------------------------------------------------------------------------- 1 | if __name__ == "__main__" and __package__ is None: 2 | import sys 3 | import pathlib 4 | import os 5 | print("Called from __main__.py as script cwd = {}".format(os.getcwd())) 6 | sys.path.append(str(pathlib.Path(__file__).parent.parent.resolve())) 7 | 8 | __package__ = "project" 9 | 10 | from project import Project 11 | 12 | def main(): 13 | print("Called from main()") 14 | p = Project() 15 | p.main() 16 | 17 | if __name__ == "__main__": 18 | print("Called from __main__.py") 19 | main() -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Python Boilerplate Project 2 | 3 | This is a boilerplate template for python project 4 | 5 | ## Setup 6 | 7 | Create Virtual environment 8 | 9 | ``` 10 | python -m venv .venv 11 | ``` 12 | 13 | Activate virtual environment 14 | 15 | ``` 16 | .\.venv\Scripts\Activate.ps1 17 | ``` 18 | 19 | ``` 20 | pip install -r requirements.txt 21 | ``` 22 | 23 | ## Running the software 24 | 25 | ``` 26 | python entry.py 27 | ``` 28 | 29 | ## Create Windows distribution 30 | 31 | Make sure to run this in the virtual environment. 32 | 33 | ``` 34 | pyinstaller --name="Project Name" --onefile entry.py 35 | ``` 36 | -------------------------------------------------------------------------------- /Project Name.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | 3 | 4 | block_cipher = None 5 | 6 | 7 | a = Analysis( 8 | ['entry.py'], 9 | pathex=[], 10 | binaries=[], 11 | datas=[], 12 | hiddenimports=[], 13 | hookspath=[], 14 | hooksconfig={}, 15 | runtime_hooks=[], 16 | excludes=[], 17 | win_no_prefer_redirects=False, 18 | win_private_assemblies=False, 19 | cipher=block_cipher, 20 | noarchive=False, 21 | ) 22 | pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) 23 | 24 | exe = EXE( 25 | pyz, 26 | a.scripts, 27 | a.binaries, 28 | a.zipfiles, 29 | a.datas, 30 | [], 31 | name='Project Name', 32 | debug=False, 33 | bootloader_ignore_signals=False, 34 | strip=False, 35 | upx=True, 36 | upx_exclude=[], 37 | runtime_tmpdir=None, 38 | console=True, 39 | disable_windowed_traceback=False, 40 | argv_emulation=False, 41 | target_arch=None, 42 | codesign_identity=None, 43 | entitlements_file=None, 44 | ) 45 | --------------------------------------------------------------------------------