带有 Django 的 Heroku 上的 Memcached:无法安装 pylibmc / memcacheify
Posted
技术标签:
【中文标题】带有 Django 的 Heroku 上的 Memcached:无法安装 pylibmc / memcacheify【英文标题】:Memcached on Heroku w/ Django : can't install pylibmc / memcacheify 【发布时间】:2012-07-15 11:56:07 【问题描述】:我在这方面花了很多时间,这显然超出了我的新手理解/技能范围。我尝试使用 pip install 安装django-heroku-memcacheify,这会引发错误。我将问题追踪到pylibmc,这导致了所有问题。这是错误日志中有趣的部分之一:
_pylibmcmodule.h:42:36: 错误: libmemcached/memcached.h: 没有这样的文件或 目录
这是(几乎)完整的追溯:
-----> Heroku receiving push
-----> Fetching custom buildpack... done
-----> Python app detected
-----> Preparing Python interpreter (2.7.2)
-----> Creating Virtualenv version 1.7.2
! CLEAN_VIRTUALENV set, rebuilding virtualenv.
Running virtualenv with interpreter /usr/local/bin/python2.7
New python executable in .heroku/venv/bin/python2.7
Not overwriting existing python script .heroku/venv/bin/python (you must
use .heroku/venv/bin/python2.7)
Installing distribute..................................................................................................................................................................................................done.
Installing pip................done.
-----> Activating virtualenv
-----> Installing dependencies using pip version 1.1
Requirement already satisfied (use --upgrade to upgrade): Django==1.4 in
./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 2))
Requirement already satisfied (use --upgrade to upgrade): gunicorn==0.14.3 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 3))
Requirement already satisfied (use --upgrade to upgrade): PIL==1.1.7 in ./.heroku/venv/lib/python2.7/site-packages/PIL (from -r requirements/common.txt (line 4))
Requirement already satisfied (use --upgrade to upgrade): South==0.7.5 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 5))
Requirement already satisfied (use --upgrade to upgrade): boto==2.1.1 in
./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 6))
Downloading/unpacking distribute==0.6.10 (from -r requirements/common.txt (line 7))
Using download cache from /app/tmp/repo.git/.cache/pip_downloads/http%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Fd%2Fdistribute%2Fdistribute-0.6.10.tar.gz
Running setup.py egg_info for package distribute
Requirement already satisfied (use --upgrade to upgrade): python-dateutil==1.5 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 8))
Requirement already satisfied (use --upgrade to upgrade): six==1.1.0 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 9))
Requirement already satisfied (use --upgrade to upgrade): django-appconf==0.5 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 10))
Requirement already satisfied (use --upgrade to upgrade): dj-database-url==0.2.0 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 11))
Downloading/unpacking django-compressor==dev (from -r requirements/common.txt (line 12))
Using download cache from /app/tmp/repo.git/.cache/pip_downloads/http%3A%2F%2Fgithub.com%2Fjezdez%2Fdjango_compressor%2Ftarball%2Fdevelop
Cannot determine compression type for file /app/tmp/repo.git/.cache/pip_downloads/http%3A%2F%2Fgithub.com%2Fjezdez%2Fdjango_compressor%2Ftarball%2Fdevelop
Running setup.py egg_info for package django-compressor
Requested django-compressor==dev (from -r requirements/common.txt (line 12)), but installing version 1.2a2
Requirement already satisfied (use --upgrade to upgrade): django-crispy-forms==1.1.2 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 13))
Requirement already satisfied (use --upgrade to upgrade): django-extensions==0.9 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 14))
Requirement already satisfied (use --upgrade to upgrade): django-facebook==4.0.9 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 15))
Requirement already satisfied (use --upgrade to upgrade): django-floppyforms==1.0 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 16))
Requirement already satisfied (use --upgrade to upgrade): django-guardian==1.0.4 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 17))
Requirement already satisfied (use --upgrade to upgrade): django-image-cropping==0.5 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 18))
Requirement already satisfied (use --upgrade to upgrade): django-ratings==0.3.6 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 19))
Requirement already satisfied (use --upgrade to upgrade): django-smuggler==0.3 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 20))
Requirement already satisfied (use --upgrade to upgrade): django-storages==1.1.4 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 21))
Requirement already satisfied (use --upgrade to upgrade): django-subdomains==1.2.1 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 22))
Requirement already satisfied (use --upgrade to upgrade): django-s3-folder-storage==0.1 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 23))
Requirement already satisfied (use --upgrade to upgrade): django-userena==1.1.0 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 24))
Requirement already satisfied (use --upgrade to upgrade): Whoosh==2.4.0 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 25))
Requirement already satisfied (use --upgrade to upgrade): brabeion==0.1 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 26))
Requirement already satisfied (use --upgrade to upgrade): versiontools==1.9.1 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 27))
Obtaining django-haystack from git+https://github.com/toastdriven/django-haystack.git@25bd361d3c64cc22a1090a5053465939647d973d#egg=django_haystack-dev (from -r requirements/common.txt (line 28))
Updating ./.heroku/src/django-haystack clone (to 25bd361d3c64cc22a1090a5053465939647d973d)
Could not find a tag or branch '25bd361d3c64cc22a1090a5053465939647d973d', assuming commit.
Running setup.py egg_info for package django-haystack
Obtaining django-taggit from git+git://github.com/shacker/django-taggit.git@7987beaf357f8d3621c7fbce3b6753dd21962ee7#egg=django_taggit-dev (from -r requirements/common.txt (line 29))
Updating ./.heroku/src/django-taggit clone (to 7987beaf357f8d3621c7fbce3b6753dd21962ee7)
Could not find a tag or branch '7987beaf357f8d3621c7fbce3b6753dd21962ee7', assuming commit.
Running setup.py egg_info for package django-taggit
Obtaining django-generic-aggregation from git+git://github.com/coleifer/django-generic-aggregation.git@c76408c2c002dcab6bfc3148760ee58a19cbe05e#egg=django_generic_aggregation-dev (from -r requirements/common.txt (line 30))
Updating ./.heroku/src/django-generic-aggregation clone (to c76408c2c002dcab6bfc3148760ee58a19cbe05e)
Could not find a tag or branch 'c76408c2c002dcab6bfc3148760ee58a19cbe05e', assuming commit.
Running setup.py egg_info for package django-generic-aggregation
Requirement already satisfied (use --upgrade to upgrade): easy-thumbnails==1.0.3 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 31))
Requirement already satisfied (use --upgrade to upgrade): docutils==0.9 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 32))
Requirement already satisfied (use --upgrade to upgrade): httplib2==0.7.4 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt
(line 33))
Requirement already satisfied (use --upgrade to upgrade): reportlab==2.5
in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/common.txt (line 34))
Requirement already satisfied (use --upgrade to upgrade): wsgiref==0.1.2
in /usr/local/lib/python2.7 (from -r requirements/common.txt (line 35))
Downloading/unpacking django-pylibmc-sasl==0.2.4 (from -r requirements/prod.txt (line 3))
Downloading django-pylibmc-sasl-0.2.4.tar.gz
Storing download in cache at /app/tmp/repo.git/.cache/pip_downloads/http%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Fd%2Fdjango-pylibmc-sasl%2Fdjango-pylibmc-sasl-0.2.4.tar.gz
Running setup.py egg_info for package django-pylibmc-sasl
Requirement already satisfied (use --upgrade to upgrade): psycopg2==2.4.5 in ./.heroku/venv/lib/python2.7/site-packages (from -r requirements/prod.txt (line 4))
Downloading/unpacking pylibmc==1.2.3 (from -r requirements/prod.txt (line 5))
Storing download in cache at /app/tmp/repo.git/.cache/pip_downloads/http%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Fp%2Fpylibmc%2Fpylibmc-1.2.3.tar.gz
Running setup.py egg_info for package pylibmc
Downloading/unpacking django-heroku-memcacheify==0.3 (from -r requirements/prod.txt (line 6))
Downloading django-heroku-memcacheify-0.3.tar.gz
Storing download in cache at /app/tmp/repo.git/.cache/pip_downloads/http%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Fd%2Fdjango-heroku-memcacheify%2Fdjango-heroku-memcacheify-0.3.tar.gz
Running setup.py egg_info for package django-heroku-memcacheify
Installing collected packages: distribute, django-compressor, django-haystack, django-taggit, django-generic-aggregation, django-pylibmc-sasl, pylibmc, django-heroku-memcacheify
Found existing installation: distribute 0.6.27
Uninstalling distribute:
Successfully uninstalled distribute
Running setup.py install for distribute
Before install bootstrap.
Scanning installed packages
Setuptools installation detected at /tmp/build_vk3edwx3xe4q/.heroku/venv/lib/python2.7/site-packages
Non-egg installation
Removing elements out of the way...
Already patched.
/tmp/build_vk3edwx3xe4q/.heroku/venv/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info already patched.
Installing easy_install script to /tmp/build_vk3edwx3xe4q/.heroku/venv/bin
Installing easy_install-2.7 script to /tmp/build_vk3edwx3xe4q/.heroku/venv/bin
After install bootstrap.
/tmp/build_vk3edwx3xe4q/.heroku/venv/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info already exists
Found existing installation: django-compressor 1.2a2
Uninstalling django-compressor:
Successfully uninstalled django-compressor
Running setup.py install for django-compressor
Running setup.py develop for django-haystack
Creating /tmp/build_vk3edwx3xe4q/.heroku/venv/lib/python2.7/site-packages/django-haystack.egg-link (link to .)
django-haystack 2.0.0-beta is already the active version in easy-install.pth
Installed /tmp/build_vk3edwx3xe4q/.heroku/src/django-haystack
Running setup.py develop for django-taggit
Creating /tmp/build_vk3edwx3xe4q/.heroku/venv/lib/python2.7/site-packages/django-taggit.egg-link (link to .)
django-taggit 0.9.4 is already the active version in easy-install.pth
Installed /tmp/build_vk3edwx3xe4q/.heroku/src/django-taggit
Running setup.py develop for django-generic-aggregation
Creating /tmp/build_vk3edwx3xe4q/.heroku/venv/lib/python2.7/site-packages/django-generic-aggregation.egg-link (link to .)
django-generic-aggregation 0.3.1 is already the active version in easy-install.pth
Installed /tmp/build_vk3edwx3xe4q/.heroku/src/django-generic-aggregation
Running setup.py install for django-pylibmc-sasl
Running setup.py install for pylibmc
building '_pylibmc' extension
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DUSE_ZLIB -I/usr/local/include/python2.7 -c _pylibmcmodule.c -o build/temp.linux-x86_64-2.7/_pylibmcmodule.o -fno-strict-aliasing
In file included from _pylibmcmodule.c:34:
_pylibmcmodule.h:42:36: error: libmemcached/memcached.h: No such file or directory
_pylibmcmodule.c: In function â?~init_pylibmcâ?T:
_pylibmcmodule.c:2140: error: â?~LIBMEMCACHED_VERSION_STRINGâ?T undeclared (first use in this function)
_pylibmcmodule.c:2140: warning: passing argument 3 of â?~PyModule_AddStringConstantâ?T from incompatible pointer type
/usr/local/include/python2.7/modsupport.h:42: note: expected â?~const char *â?T but argument is of type â?~struct PylibMC_Behavior *â?T
error: command 'gcc' failed with exit status 1
Complete output from command /tmp/build_vk3edwx3xe4q/.heroku/venv/bin/python2.7 -c "import setuptools;__file__='/tmp/build_vk3edwx3xe4q/.heroku/venv/build/pylibmc/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /tmp/pip-Y7MRuY-record/install-record.txt --install-headers /tmp/build_vk3edwx3xe4q/.heroku/venv/include/site/python2.7:
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-2.7
creating build/lib.linux-x86_64-2.7/pylibmc
copying pylibmc/__main__.py -> build/lib.linux-x86_64-2.7/pylibmc
copying pylibmc/pools.py -> build/lib.linux-x86_64-2.7/pylibmc
copying pylibmc/__init__.py -> build/lib.linux-x86_64-2.7/pylibmc
copying pylibmc/client.py -> build/lib.linux-x86_64-2.7/pylibmc
copying pylibmc/consts.py -> build/lib.linux-x86_64-2.7/pylibmc
copying pylibmc/test.py -> build/lib.linux-x86_64-2.7/pylibmc
running build_ext
building '_pylibmc' extension
creating build/temp.linux-x86_64-2.7
gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DUSE_ZLIB -I/usr/local/include/python2.7 -c _pylibmcmodule.c -o build/temp.linux-x86_64-2.7/_pylibmcmodule.o -fno-strict-aliasing
In file included from _pylibmcmodule.c:34:
_pylibmcmodule.h:42:36: error: libmemcached/memcached.h: No such file or
directory
In file included from _pylibmcmodule.c:34:
_pylibmcmodule.h:75: error: expected declaration specifiers or â?~...â?T before â?~*â?T token
...Lots of errors...
_pylibmcmodule.c: In function â?~init_pylibmcâ?T:
_pylibmcmodule.c:2140: error: â?~LIBMEMCACHED_VERSION_STRINGâ?T undeclared (first use in this function)
_pylibmcmodule.c:2140: warning: passing argument 3 of â?~PyModule_AddStringConstantâ?T from incompatible pointer type
/usr/local/include/python2.7/modsupport.h:42: note: expected â?~const char *â?T but argument is of type â?~struct PylibMC_Behavior *â?T
error: command 'gcc' failed with exit status 1
----------------------------------------
Command /tmp/build_vk3edwx3xe4q/.heroku/venv/bin/python2.7 -c "import setuptools;__file__='/tmp/build_vk3edwx3xe4q/.heroku/venv/build/pylibmc/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /tmp/pip-Y7MRuY-record/install-record.txt --install-headers /tmp/build_vk3edwx3xe4q/.heroku/venv/include/site/python2.7 failed with error code 1 in /tmp/build_vk3edwx3xe4q/.heroku/venv/build/pylibmc
Storing complete log in /app/.pip/pip.log
! Heroku push rejected, failed to compile Python app
To git@heroku.com:crowdcademy.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:crowdcademy.git'
这就是交易
我无法在我的本地环境 b/c 中对其进行测试,我正在 Windows 上运行。但是从我读到的libmemcached 是heroku 上的already installed。而且似乎没有其他人对 pylibmc 有任何问题,因为我在谷歌上找不到任何东西。 In this post他们在说:
如果他们检测到您正在加载 pylibmc,他们将引导 libmemcached 为您服务
这可能是问题所在,要么未提供,要么路径错误。任何帮助表示赞赏!如果这不起作用,我将不得不使用 Redis,这似乎要困难得多......不知道我是否足够先进。
编辑 可能无关紧要,但我使用的是带有 init 的设置文件夹而不是 settings.py 文件。我听说这会导致一些奇怪的行为,因为 heroku 并不总是记得这是可能的。
编辑 2
由于有数百人在 heroku 上运行 memcached 和 django 没有任何问题,我认为 heroku 用户不应该使用某种 hack 来安装 libmemcached。当 heroku 在您的需求文件中检测到 pylibmc 时,文档会谈论它,就好像它是为您引导的一样。这使我得出结论:A) 要么我的设置或我使用的某个应用程序有问题,要么 B) heroku 最近更改了某些内容并破坏了自动为 django 引导 libmemcached。我尝试使用 heroku config 进行全新安装:添加 CLEAN_VIRTUALENV=true 但 that's not working either right now。我希望它是 A 并且有人遇到了同样的问题。如果是B我不知道怎么解决。
【问题讨论】:
这个问题今天突然发生在我身上......而且 memcached 已经为我工作了几个月。我很高兴你问这个,因为 tiwei 的回答是正确的。我将我的需求重组为多个需求文件,根需求导入它们;这似乎是致命的。我想我只是将 pylibmc 放在根文件中,这应该可以清除它。 【参考方案1】:我与 Heroku 的友好人士交谈过,似乎我的 requirements.txt 设置造成了所有破坏。不要在根目录中使用从另一个需求文件导入的需求文件!至少对于 pylibmc 不起作用,因为如果根需求文件中没有明确的 pylibmc 行,libmemcached 不会被引导。我希望这将帮助其他人避免浪费我在这个问题上花费的 10 个小时。耶!
【讨论】:
非常感谢!我不敢相信事情就这么简单。这确实需要记录在案。 感谢您抽出宝贵时间回答您自己的问题! 您不必为 Heroku 扁平化您的需求文件。将#pylibmc
添加到requirements.txt
对我有用。
你找到在 windows 上 pip install pylibmc 的方法了吗?
要澄清这个答案,您需要确保 pylibmc
出现在您的需求文件中,否则 Heroku 不会检测到您需要该库。例如,将pylibmc==1.2.3
添加到文件中。【参考方案2】:
您需要安装libmemcached
。
您不需要开发标头或任何东西,常规的就足够了!
如果无法安装 libmemcached,则无法安装 pylibmc。对此很抱歉,但没什么可做的。
有一种方法可以解决这个问题,但这是一个废话,如果你想了解详细信息,请给我留言。
【讨论】:
感谢 lericson,我尝试了一些技巧来安装它,但是当您尝试离开 pip 时,heroku 不喜欢它。我相信 heroku 正在为您安装 libmemcached,至少这是应该发生的。这有点模糊,文档几乎没有谈论它。 sudo apt-get install -y libmemcached-dev zlib1g-dev libssl-dev python-dev build-essential pip install pylibmc【参考方案3】:您是否尝试过类似 libmemcached-dev、memcached-dev 的方法?你需要 libmemcached 的来源!
【讨论】:
我不确定是否可以在 heroku 上安装 libmemcached,我可能没有这样做的 root 权限。另外,如果它不在我的 requirements.txt 中,它不会在我 git push 更新时自动安装。但我愿意尝试任何事情,我的假设可能是错误的! libmemcached-dev 为我修复了它(Ubuntu)【参考方案4】:试试这个:
sudo apt-get install libmemcached-dev
【讨论】:
以上是关于带有 Django 的 Heroku 上的 Memcached:无法安装 pylibmc / memcacheify的主要内容,如果未能解决你的问题,请参考以下文章
heroku 上的 Django 和 imagekit 保存到 AWS S3 非常慢
如何将带有 django 的 react.js webpack 部署到 heroku?
Heroku 上带有 Postgresql 的 Django - settings.DATABASES 配置不正确。请提供名称值