我的本地git/virtualenv使用的是pip
1.3.1版本。当我尝试将Python 3.3.2应用程序推送到Heroku时,我得到
Downloading/unpacking distribute==0.6.34 (from -r requirements.txt (line 5))
Running setup.py egg_info for package distribute
Traceback (most recent call last):
File "<string>", line 3, in <module>
File "./setuptools/__init__.py", line 2, in <module>
from setuptools.extension import Extension, Library
File "./setuptools/extension.py", line 5, in <module>
from setuptools.dist import _get_unpatched
File "./setuptools/dist.py", line 103
except ValueError, e:
^
SyntaxError: invalid syntax
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 3, in <module>
File "./setuptools/__init__.py", line 2, in <module>
from setuptools.extension import Extension, Library
File "./setuptools/extension.py", line 5, in <module>
from setuptools.dist import _get_unpatched
File "./setuptools/dist.py", line 103
except ValueError, e:
^
SyntaxError: invalid syntax
----------------------------------------
Command python setup.py egg_info failed with error code 1 in /tmp/pip-build-u58345/distribute
Storing complete log in /app/.pip/pip.log
! Push rejected, failed to compile Python app
给定我不能手动安装distribute
在Heroku的服务器上,我应该如何避免这个错误?
你看到的行为是pip本身的问题:https://github.com/pypa/pip/issues/650
似乎pip使用了distribute来升级distribute.
然而,你需要做的就是从requirements.txt中删除分发文件。它已经在那里了,因为它是由构建包安装的,所以不需要使用pip再次安装它。
我相信你实际上可以并且正在通过默认的构建包在heroku的服务器上安装distribution。Heroku的Python支持以构建包的形式实现。你可以在这里阅读更多关于构建包的信息。
如果你希望有一个特定版本的分发,在这种情况下没有pip-bug,你必须在你的应用程序正在使用的构建包中替换它的源代码。可以这样做:
- 在https://github.com/heroku/heroku-buildpack-python从heroku获取原始构建包
- 在您克隆的构建包中(在撰写本文时),您将找到
/vendor/distribute-0.6.36
。这就是问题所在。 -
在构建包的
bin/compile
脚本中,替换构建包使用的分发版本。在我的情况下,这是替换第31行DISTRIBUTE_VERSION="0.6.36"
与DISTRIBUTE_VERSION="0.6.45"
-
上传你的构建包到github并告诉heroku使用它
$ heroku config:set BUILDPACK_URL=https://github.com/you/name-of-buildpack-python-repo.git
或者
告诉heroku使用我的自定义构建包,而不是原来的。我的构建包与原始版本的唯一区别是步骤1-4中描述的那些。
覆盖现有应用程序的构建包:
$ heroku config:set BUILDPACK_URL=https://github.com/jhnwsk/heroku-buildpack-python.git
或者创建一个新的应用
$ heroku create myapp --buildpack https://github.com/jhnwsk/heroku-buildpack-python.git
当你在做了这些修改后把你的应用推送到Heroku时,你应该看到类似
的内容-----> Fetching custom git buildpack... done
-----> Python app detected
-----> No runtime.txt provided; assuming python-2.7.4.
-----> Preparing Python runtime (python-2.7.4)
-----> Installing Distribute (0.6.45)
-----> Installing Pip (1.3.1)