Memcached на Heroku с Django: невозможно установить pylibmc / memcacheify

Я потратил много времени на это, и это явно выходит за рамки моего понимания / навыков новичка. Я попытался установить https://github.com/rdegges/django-heroku-memcacheify с помощью pip install, который выдает ошибки. Я отследил проблему до 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'

Так вот сделка

Я не могу проверить это в моем локальном окружении, потому что я работаю на куске Windows. Но из того, что я прочитал, libmemcached уже установлен на heroku. И никто другой, кажется, не имеет никаких проблем с pylibmc, потому что я не мог найти что-либо в Google. В этом посте они говорят о:

что если они обнаружат, что вы загружаете pylibmc, они загрузят libmemcached для вас

Это может быть проблемой, либо она не указана, либо указан неверный путь. Любая помощь приветствуется! если это не сработает, мне придется использовать Redis, который кажется намного сложнее... не знаю, достаточно ли я продвинут для этого.

Редактирование может быть неуместным, но я использую папку настроек с init вместо файла settings.py. Я слышал, что это может привести к некоторому странному поведению, поскольку heroku не всегда помнит, что это возможно.

Редактировать 2

Поскольку сотни людей без проблем запускают memcached и django на heroku, я не думаю, что пользователи heroku должны устанавливать libmemcached с каким-то хаком. Документы говорят об этом, как будто он загружается для вас, когда heroku обнаруживает pylibmc в вашем файле требований. Что приводит меня к выводу: A) либо что-то не так в моих настройках, либо в одном из приложений, которые я использую, либо B) heroku недавно что-то изменил и сломал автоматическую загрузку libmemcached для django. Я пытался получить новую установку с настройкой heroku: добавьте CLEAN_VIRTUALENV=true, но сейчас это тоже не работает. Я надеюсь, что это А, и у кого-то была такая же проблема. Если это Б, я понятия не имею, как это решить.

4 ответа

Решение

Я поговорил с дружелюбными людьми в Heroku, и похоже, что мои требования.txt вызвали хаос. Не используйте файл требований в корне, который импортирует из другого файла требований! По крайней мере, для pylibmc это не работает, потому что libmemcached не загружается, если в файле корневых требований нет явной строки с pylibmc. Я надеюсь, что это поможет другим избежать потери 10 часов, которые я потратил на эту проблему. Ура!

Тебе нужно libmemcached установлены.

Вам не нужны заголовки для разработки или что-то еще, обычных более чем достаточно!

Если вы не можете установить libmemcached, вы не можете установить pylibmc. Извините за это, но тут уж ничего не поделаешь.

Есть способ обойти это, но это дерьмовая идея, поэтому напишите мне, если хотите узнать подробности.

Вы пробовали что-то вроде libmemcached-dev, memcached-dev? Вам нужны ИСТОЧНИКИ libmemcached!

Попробуй это:

sudo apt-get install libmemcached-dev
Другие вопросы по тегам