diff --git a/.travis.yml b/.travis.yml
index 71847f2982e8cd54e765f06bbbc84e76489188ae..c0bea40bfdee0f29089057c63e076b45a29ff13e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,6 +4,30 @@ env:
     - GCC_VERSION="4.9"
 matrix:
   include:
+    - language: python
+      python: "2.7"
+      install:
+        - "pip install wheel twine"
+      script:
+        - "cd python/"
+        - 'VERSION="$TRAVIS_TAG" python setup.py sdist bdist_wheel'
+        - "cd ../"
+      deploy:
+        # Checkpointed release builds.
+        - provider: script
+          script: .travis/deploy-python.sh
+          skip_cleanup: true
+          on:
+            tags: true
+            # all_branches must be set with tags: true. See below post:
+            # https://stackoverflow.com/a/27775257/1076585
+            all_branches: true
+        # Produce a new build for the cutting edge when master changes.
+        - provider: script
+          script: .travis/deploy-python.sh
+          skip_cleanup: true
+          on:
+            branch: master
     - language: cpp
       os:
       - linux
diff --git a/.travis/deploy-python.sh b/.travis/deploy-python.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4cc03460f53654855e202185b6881bd64cab8076
--- /dev/null
+++ b/.travis/deploy-python.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+PROD_REPOSITORY="https://upload.pypi.org/legacy/"
+TEST_REPOSITORY="https://test.pypi.org/legacy/"
+
+twine upload \
+    --username "$PYPI_USERNAME" \
+    --password "$PYPI_PASSWORD" \
+    --repository-url "$PROD_REPOSITORY" \
+    "$DIR/../python/dist/"*
+
diff --git a/python/.gitignore b/python/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..a7719469a3a24cf6a67f1721eecdb663438006af
--- /dev/null
+++ b/python/.gitignore
@@ -0,0 +1,2 @@
+/dist/
+/*.egg-info/
diff --git a/python/setup.py b/python/setup.py
index 39afef34bceb231e517175945af95793e8049b65..5aadef44a9c09f143779d01bcfa2745b0d4921a9 100644
--- a/python/setup.py
+++ b/python/setup.py
@@ -12,11 +12,38 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import os
+from datetime import datetime
 from setuptools import setup
 
+
+def version():
+    version = os.getenv('VERSION', None)
+    if version:
+        # Most git tags are prefixed with 'v' (example: v1.2.3) this is
+        # never desirable for artifact repositories, so we strip the
+        # leading 'v' if it's present.
+        return version[1:] if version.startswith('v') else version
+    else:
+        # Default version is an ISO8601 compiliant datetime. PyPI doesn't allow
+        # the colon ':' character in its versions, and time is required to allow
+        # for multiple publications to master in one day. This datetime string
+        # uses the "basic" ISO8601 format for both its date and time components
+        # to avoid issues with the colon character (ISO requires that date and
+        # time components of a date-time string must be uniformly basic or
+        # extended, which is why the date component does not have dashes.
+        #
+        # Publications using datetime versions should only be made from master
+        # to represent the HEAD moving forward.
+        version = datetime.utcnow().strftime('%Y%m%d%H%M%S')
+        print("VERSION environment variable not set, using datetime instead: {}"
+              .format(version))
+
+    return version
+
 setup(
     name='flatbuffers',
-    version='2015.05.14.0',
+    version=version(),
     license='Apache 2.0',
     author='FlatBuffers Contributors',
     author_email='me@rwinslow.com',