Memcached на Heroku w/Django: невозможно установить pylibmc/memcacheify
Я потратил много времени на это, и это явно выходит за рамки понимания моих новичков/навыков. Я попытался установить django-heroku-memcacheify с установкой pip, которая вызывает ошибки. Я отследил проблему до pylibmc, что вызывает все проблемы. Здесь одна из интересных частей журнала ошибок:
_pylibmcmodule.h: 42: 36: error: 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/[email protected]#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/[email protected]#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/[email protected]9cbe05e#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 [email protected]:crowdcademy.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to '[email protected]:crowdcademy.git'
Итак, здесь сделка
Я не могу протестировать его в своем локальном env b/c. Я запускаю на куске дерьма. Но из того, что я читал libmemcached, уже установлен по героку. И никто другой, кажется, не имеет проблем с pylibmc, потому что я не мог найти ничего в google. В этом сообщении они говорят о:
если они обнаруживают, что вы загружаете pylibmc, они будут загружаться libmemcached для вас
Это может быть проблема, либо она не указана, либо неправильный путь. Любая помощь приветствуется! если это не сработает, мне придется использовать Redis, который, кажется, намного сложнее... не знаю, насколько я достаточно продвинулся для этого.
Edit
Может быть, не имеет значения, но я использую папку настроек с init вместо файла settings.py. Я слышал, что это может привести к некоторому странному поведению, поскольку герою не всегда помнит, что это возможно.
Изменить 2
Так как сотни людей запускают memcached и django на heroku без каких-либо проблем, я не думаю, что пользователи-героки должны установить libmemcached с каким-то взломом. Документы говорят об этом, как будто он загружается для вас, когда heroku обнаруживает pylibmc в вашем файле требований. Это приводит меня к выводу: A) либо что-то не так в моих настройках или в одном из приложений, которые я использую, или B) heroku недавно что-то изменил и сломал автоматический загрузку libmemcached для django. Я попытался получить новую установку с конфигурацией heroku: добавьте CLEAN_VIRTUALENV = true, но который не работает прямо сейчас. Я надеюсь, что это A, и у кого-то была такая же проблема. Если он B, я понятия не имею, как его решить.
Ответы
Ответ 1
Я разговаривал с дружелюбными людьми в Heroku, и похоже, что моя установка требований. txt вызывала весь хаос. Не используйте файл требований в корневом каталоге, который импортирует из другого файла требований! По крайней мере, для pylibmc, который не работает, потому что libmemcached не загружается, если в корневом файле требований нет явной строки с pylibmc. Надеюсь, это поможет другим избежать траты 10 часов, потраченных на эту проблему. Ура!
Ответ 2
Вам понадобится libmemcached
.
Вам не нужны заголовки разработки или что-то еще, обычные более чем достаточно!
Если вы не можете установить libmemcached, вы не можете установить pylibmc. Извините, но ничего не поделаешь.
Есть способ обойти это, но это идея дерьма, так что сообщите мне, если вы хотите подробности.
Ответ 3
Вы пробовали что-то вроде libmemcached-dev, memcached-dev? Вам нужны ИСТОЧНИКИ libmemcached!
Ответ 4
Попробуйте следующее:
sudo apt-get install libmemcached-dev