User:Timothee Flutre/Notebook/Postdoc/2012/05/16
From OpenWetWare
< User:Timothee Flutre | Notebook | Postdoc | 2012 | 05
Main project page Previous entry Next entry
| |
Typical templates for Python scripts, C++ programs and othersIt is always rewarding on the long term to start any piece of computer software with a minimum amount of generic code (verbose, command-line options, help message, license, etc). But it's a pain to write all this every time, right? So below are my typical templates for any Python script, C++ programs and others.
#!/usr/bin/env python
# Author: Timothee Flutre
# License: GPL-3
# Aim: does this and that
# help2man -o MyClass.man ./MyClass.py
# groff -mandoc MyClass.man > MyClass.ps
import sys
import os
import getopt
import time
import datetime
import math
class MyClass(object):
def __init__(self):
self.verbose = 1
self.input = ""
def help(self):
msg = "`%s' does this and that.\n" % os.path.basename(sys.argv[0])
msg += "\n"
msg += "Usage: %s [OPTIONS] ...\n" % os.path.basename(sys.argv[0])
msg += "\n"
msg += "Options:\n"
msg += " -h, --help\tdisplay the help and exit\n"
msg += " -V, --version\toutput version information and exit\n"
msg += " -v, --verbose\tverbosity level (0/default=1/2/3)\n"
msg += " -i\tinput"
msg += "\n"
msg += "Examples:\n"
print msg; sys.stdout.flush()
def version(self):
msg = "%s 0.1\n" % os.path.basename(sys.argv[0])
msg += "\n"
msg += "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n"
msg += "This is free software; see the source for copying conditions. There is NO\n"
msg += "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
print msg; sys.stdout.flush()
def setAttributesFromCmdLine(self):
try:
opts, args = getopt.getopt( sys.argv[1:], "hVv:i:",
["help", "version", "verbose="])
except getopt.GetoptError, err:
sys.stderr.write("%s\n" % str(err))
self.help()
sys.exit(2)
for o, a in opts:
if o == "-h" or o == "--help":
self.help()
sys.exit(0)
elif o == "-V" or o == "--version":
self.version()
sys.exit(0)
elif o == "-v" or o == "--verbose":
self.verbose = int(a)
elif o == "-i":
self.input = a
else:
assert False, "unhandled option"
def checkAttributes(self):
if self.input == "":
msg = "ERROR: missing compulsory option -i"
sys.stderr.write("%s\n\n" % msg)
self.help()
sys.exit(1)
if not os.path.exists(self.input):
msg = "ERROR: can't find '%s'" % self.input
sys.stderr.write("%s\n\n" % msg)
self.help()
sys.exit(1)
def run(self):
self.checkAttributes()
if self.verbose > 0:
msg = "START %s" % time.strftime("%Y-%m-%d %H:%M:%S")
startTime = time.time()
print msg; sys.stdout.flush()
# ... specific code ...
if self.verbose > 0:
msg = "END %s" % time.strftime("%Y-%m-%d %H:%M:%S")
endTime = time.time()
runLength = datetime.timedelta(seconds=
math.floor(endTime - startTime))
msg += " (%s)" % str(runLength)
print msg; sys.stdout.flush()
if __name__ == "__main__":
i = MyClass()
i.setAttributesFromCmdLine()
i.run()
/** \file myprogram.cpp
*
* `myprogram' does this and that.
* Copyright (C) 2011,2012 Timothee Flutre
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* g++ -Wall -g utils.cpp myprogram.cpp -lgsl -lgslcblas -lz -o myprogram
* help2man -o myprogram.man ./myprogram
* groff -mandoc myprogram.man > myprogram.ps
*/
#include <cmath>
#include <ctime>
#include <getopt.h>
#include <iostream>
#include <string>
using namespace std;
#include "utils.h"
/** \brief Display the help on stdout.
*/
void help (char ** argv)
{
cout << "`" << argv[0] << "'"
<< " does this and that." << endl
<< endl
<< "Usage: " << argv[0] << " [OPTIONS] ..." << endl
<< endl
<< "Options:" << endl
<< " -h, --help\tdisplay the help and exit" << endl
<< " -V, --version\toutput version information and exit" << endl
<< " -v, --verbose\tverbosity level (0/default=1/2/3)" << endl
<< " -i, --in\tinput" << endl
<< endl
<< "Examples:" << endl
<< " " << argv[0] << " -i <input>" << endl
<< endl
<< "Remarks:" << endl
<< " This is my typical template file for C++." << endl
;
}
/** \brief Display version and license information on stdout.
*/
void version (char ** argv)
{
cout << argv[0] << " " << __DATE__ << " " << __TIME__ << endl
<< endl
<< "Copyright (C) 2011,2012 T. Flutre." << endl
<< "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>" << endl
<< "This is free software; see the source for copying conditions. There is NO" << endl
<< "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." << endl
<< endl
<< "Written by T. Flutre." << endl;
}
/** \brief Parse the command-line arguments and check the values of the
* compulsory ones.
*/
void
parseArgs (
int argc,
char ** argv,
string & input,
int & verbose)
{
int c = 0;
while (true)
{
static struct option long_options[] =
{
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'},
{"verbose", required_argument, 0, 'v'},
{"input", required_argument, 0, 'i'},
{0, 0, 0, 0}
};
int option_index = 0;
c = getopt_long (argc, argv, "hVv:i:",
long_options, &option_index);
if (c == -1)
break;
switch (c)
{
case 0:
if (long_options[option_index].flag != 0)
break;
case 'h':
help (argv);
exit (0);
case 'V':
version (argv);
exit (0);
case 'v':
verbose = atoi(optarg);
break;
case 'i':
input = optarg;
break;
case '?':
printf ("\n"); help (argv);
abort ();
default:
printf ("\n"); help (argv);
abort ();
}
}
if (input.empty())
{
printCmdLine (argc, argv);
fprintf (stderr, "ERROR: missing compulsory option -i\n\n");
help (argv);
exit (1);
}
if (! doesFileExist (input))
{
printCmdLine (argc, argv);
fprintf (stderr, "ERROR: can't find '%s'\n\n", input.c_str());
help (argv);
exit (1);
}
}
int main (int argc, char ** argv)
{
string input;
int verbose = 1;
parseArgs (argc, argv, input, verbose);
time_t startRawTime, endRawTime;
if (verbose > 0)
{
time (&startRawTime);
cout << "START " << argv[0] << " (" << time2string (startRawTime) << ")"
<< endl
<< "compiled -> " << __DATE__ << " " << __TIME__
<< endl << flush;
printCmdLine (argc, argv);
}
// ... specific code ...
if (verbose > 0)
{
time (&endRawTime);
cout << "END " << argv[0] << " (" << time2string (endRawTime) << ")"
<< endl
<< "elapsed -> " << elapsedTime(startRawTime, endRawTime)
<< endl
<< "max.mem -> " << getMaxMemUsedByProcess () << " kB"
<< endl;
}
return EXIT_SUCCESS;
}
% Author: Timothée Flutre
\documentclass{beamer}
\usepackage{amsmath}
\usepackage{bm} % to have mathematical symbols in bold
\usepackage{hyperref}
\hypersetup{colorlinks, linkcolor=black, urlcolor=gray}
\usepackage{multirow}
\usepackage{tikz}
\usepackage[francais]{babel}
\usepackage[utf8]{inputenc}
\graphicspath{{./figures/}}
%-----------------------------------------------------------------------------
\setbeamertemplate{caption}[numbered]
\setbeamerfont{caption}{size=\scriptsize}
\setbeamertemplate{navigation symbols}{}
\setbeamercolor{alerted text}{fg=purple}
\setbeamertemplate{footline}
{
\leavevmode
\hbox{
\hspace*{-0.06cm}
\begin{beamercolorbox}[wd=.2\paperwidth,ht=2.25ex,dp=1ex,center]{author in head/foot}
\usebeamerfont{author in head/foot}\insertshortauthor \hspace*{1em} \insertshortinstitute
\end{beamercolorbox}
\begin{beamercolorbox}[wd=.50\paperwidth,ht=2.25ex,dp=1ex,center]{section in head/foot}
\usebeamerfont{section in head/foot}\insertshorttitle
\end{beamercolorbox}
\begin{beamercolorbox}[wd=.27\paperwidth,ht=2.25ex,dp=1ex,right]{section in head/foot}%
\usebeamerfont{section in head/foot}\insertshortdate{}\hspace*{2em}
\insertframenumber{} / \inserttotalframenumber\hspace*{2ex}
\end{beamercolorbox}
}
\vskip0pt
}
\AtBeginSection[]
{
\begin{frame}
\frametitle{Outline}
\addtocounter{framenumber}{-1}
\tableofcontents[currentsection]
\end{frame}
}
%-----------------------------------------------------------------------------
\title[Short title]{Long title}
\author[T. Flutre]{Timoth\'{e}e Flutre}
\institute[Short affiliation]{Long affiliation}
\date{\today}
begin{document}
\begin{frame}
\titlepage
\end{frame}
\begin{frame}
\frametitle{Outline}
\tableofcontents
\end{frame}
\section{First section}
\begin{frame}
\frametitle{I.1.}
\begin{itemize}
\item
\end{itemize}
\end{frame}
\section{Second section}
\begin{frame}
\frametitle{II.1.}
\begin{center}
%\includegraphics[width=0.95\textwidth,height=0.90\textheight,keepaspectratio=true]{myplot}%
\end{center}
\end{frame}
end{document}
| |



