scipy.stats seems quite full-featured, although I've only used rv_discrete myself. You can define a new distribution as a subclass of rv_continuous or rv_discrete, and give it methods for the density, cumulative distribution, and many other things.