Проблемы при установке библиотеки Python с бинарной зависимостью в virtualenv без sudo

1

В моем проекте Python 2.7 мне нужно установить библиотеку ta-lib. В целевой среде у меня нет прав root или sudo, поэтому приложение Python запускается в виртуальной среде.

По неизвестным причинам установка библиотеки ta-lib с помощью pip заканчивается неудачей, когда libta_lib.so находится в структуре каталога пользователя (вместо папки system/usr).

Что я сделал:

Я использую Python 2.7 для создания новой виртуальной среды:

ec2-user:~/environment $ python -V
Python 2.7.14

ec2-user:~/environment $ virtualenv -p /usr/bin/python27 my_env
Running virtualenv with interpreter /usr/bin/python27
New python executable in /home/ec2-user/environment/my_env/bin/python27
Also creating executable in /home/ec2-user/environment/my_env/bin/python
Installing setuptools, pip, wheel...done.

ec2-user:~/environment $ source my_env/bin/activate
(my_env) ec2-user:~/environment $ 

В my_env я загружаю и разворачиваю последнюю версию ta-lib. Я использую префикс-флаг, чтобы настроить путь установки к виртуальному env.

(my_env) ec2-user:~/environment/my_env $ ./configure --prefix=/home/ec2-user/environment/my_env
(my_env) ec2-user:~/environment/my_env $ make
(my_env) ec2-user:~/environment/my_env $ make install

Настроить, сделать и установить работу просто отлично. В конце система сообщает мне следующее:

Libraries have been installed in:
   /home/ec2-user/environment/my_env/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
[...]

Поэтому я добавил /home/ec2-user/environment/my_env/lib в $ LD_LIBRARY_PATH и $ LD_RUN_PATH. Пока все выглядит хорошо, но когда я

(my_env) ec2-user:~/environment/my_env $ pip install ta-lib
Collecting ta-lib
  Using cached https://files.pythonhosted.org/packages/[...]/
TA-Lib-0.4.17.tar.gz
Requirement already satisfied: numpy in ./lib/python2.7/dist-packages 
(from ta-lib) (1.15.1)
Building wheels for collected packages: ta-lib
  Running setup.py bdist_wheel for ta-lib ... error
  Complete output from command /home/ec2-user/environment/my_env/bin/python27 
-u -c "import setuptools, tokenize;__file__='/tmp/pip-install-MD3Ds7/ta- 
lib/setup.py';f=getattr(tokenize, 'open', open) 
(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, 
 __file__, 'exec'))" bdist_wheel -d /tmp/pip-wheel-dtdhyb --python-tag cp27:
  /tmp/pip-install-MD3Ds7/ta-lib/setup.py:79: UserWarning: Cannot find ta-lib 
 library, installation may fail.
    warnings.warn('Cannot find ta-lib library, installation may fail.')

а также...

creating build/temp.linux-x86_64-2.7/talib
gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -I/home/ec2-user/environment/my_env/local/lib/python2.7/dist-packages/numpy/core/include -I/usr/include -I/usr/local/include -I/opt/include -I/opt/local/include -I/usr/include/python2.7 -c talib/_ta_lib.c -o build/temp.linux-x86_64-2.7/talib/_ta_lib.o
talib/_ta_lib.c:526:28: fatal error: ta-lib/ta_defs.h: No such file or directory
 #include "ta-lib/ta_defs.h"
                            ^
compilation terminated.
error: command 'gcc' failed with exit status 1

----------------------------------------
Command "/home/ec2-user/environment/my_env/bin/python27 -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-MD3Ds7/ta-lib/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-YqZ5hO/install-record.txt --single-version-externally-managed --compile --install-headers /home/ec2-user/environment/my_env/include/site/python2.7/ta-lib" failed with error code 1 in /tmp/pip-install-MD3Ds7/ta-lib/
[...]

Я также попытался добавить "/home/ec2-user/environment/my_env/lib" в $ PATH, но результат тот же.

Почему pip не найдет либратор, который находится в папке lib внутри виртуальной среды?

Когда я устанавливаю двоичный файл ta-lib в папку по умолчанию /usr/lib (используя, конечно, sudo), pip install ta-lib найдет его и установит просто отлично. К сожалению, это не вариант целевой системы.

Я что-то неправильно делаю или пишу, игнорируя папки и переменные пути внутри виртуального envrionemt?

С уважением, Эль

Теги:
pip
virtualenv
python-2.7
ta-lib

1 ответ

2
Лучший ответ

Вам необходимо передать пользовательское местоположение установленных заголовков и общих объектов, когда pip install привязки python:

$ CPPFLAGS='-I/home/ec2-user/environment/my_env/include' \
  LDFLAGS='-L/home/ec2-user/environment/my_env/lib' pip install ta-lib
  • 0
    Круто, спасибо!
  • 0
    Рад, что смог помочь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню