Ошибка импорта для icu в Mac и Ubuntu, хотя pyicu установлен правильно - PullRequest
0 голосов
/ 07 мая 2018

У меня установлена ​​pyicu в MacOS и Ubuntu 14.04, но при импорте отображается ImportError. Для MacOS выход высокой сьерры:

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/Users/siddharthdas/venvs/chai/lib/python3.6/site-packages/icu/__init__.py", line 37, in <module>
  from _icu import *
ImportError: dlopen(/Users/siddharthdas/venvs/chai/lib/python3.6/site-packages/_icu.cpython-36m-darwin.so, 2): Symbol not found: __ZNK6icu_6114Transliterator12getTargetSetERNS_10UnicodeSetE
 Referenced from: /Users/siddharthdas/venvs/chai/lib/python3.6/site-packages/_icu.cpython-36m-darwin.so
 Expected in: flat namespace
in /Users/siddharthdas/venvs/chai/lib/python3.6/site-packages/_icu.cpython-36m-darwin.so

и на Ubuntu 14.0 это:

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/home/hackathon/venvs/grey_worm/lib/python3.4/site-packages/icu/__init__.py", line 37, in <module>
  from _icu import *
ImportError: libicui18n.so.58: cannot open shared object file: No such file or directory

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

При установке pycu последней версии на macOS (64.2) против python2.7 я сделал в setup.py, как описано выше:

INCLUDES = {
    'darwin': ['/usr/local/Cellar/icu4c/64.2'],
    'linux': [],
    'freebsd': ['/usr/local/include'],
    'win32': ['c:/icu/include'],
    'sunos5': [],
    'cygwin': [],
}

CFLAGS = {
    'darwin': ['-DPYICU_VER="%s"' %(VERSION), '-std=c++11'],
    'linux': [],
    'freebsd': ['-std=c++11'],
    'win32': ['/Zc:wchar_t', '/EHsc'],
    'sunos5': ['-std=c++11'],
    'cygwin': ['-D_GNU_SOURCE=1', '-std=c++11'],
}

LFLAGS = {
    'darwin': ['-L/usr/local/Cellar/icu4c/64.2/lib'],
    'linux': [],
    'freebsd': ['-L/usr/local/lib'],
    'win32': ['/LIBPATH:c:/icu/lib'],
    'sunos5': [],
    'cygwin': [],
}

LIBRARIES = {
    'darwin': ['/usr/local/Cellar/icu4c/64.2/lib'],
    'linux': [],
    'freebsd': ['icui18n', 'icuuc', 'icudata'],
    'win32': ['icuin', 'icuuc', 'icudt'],
    'sunos5': ['icui18n', 'icuuc', 'icudata'],
    'cygwin': ['icui18n', 'icuuc', 'icudata'],
}

и для сборки:

CFLAGS=-I/usr/local/opt/icu4c/include LDFLAGS=-L/usr/local/opt/icu4c/lib python setup.py build
python setup.py install

тогда у меня установлен PyICU 2.3.1:

Installed /usr/local/lib/python2.7/site-packages/PyICU-2.3.1-py2.7-macosx-10.14-x86_64.egg
Processing dependencies for PyICU==2.3.1
Finished processing dependencies for PyICU==2.3.1
0 голосов
/ 16 мая 2018

У меня был такой же опыт при сборке и установке pyicu из исходного кода на моем Mac High Sierra.

Сообщение об ошибке Symbol not found: __ZNK6icu_6114Transliterator12getTargetSetERNS_10UnicodeSetE является признаком несоответствия общей библиотеки между версией ICU, которую мы используем, и версией, которая фактически использовалась при сборке пакета (Mac имеет встроенную библиотеку ICU в /usr/library/libicucore.dylib - которую я подозреваю, используется по умолчанию в процессе сборки).

Итак, я сделал следующее, чтобы установить pyicu и запустить его с правильной версией icu:

  1. Удалите и переустановите icu4c, используя homebrew (brew remove icu4c и brew install icu4c)

  2. Создание символической ссылки icu-config по стандартному пути (ln -s /usr/local/Cellar/icu4c/61.1/bin/icu-config /usr/local/bin/icu-config)

  3. Клонировать Pyicu из репозитория, отредактировать файл setup.py и заполнить записи для 'darwin' в разделах INCLUDES, CFLAGS, LFLAGS, LIBRARIES следующим образом:

    INCLUDES = {
        'darwin': ['/usr/local/Cellar/icu4c/61.1/include']
    }
    
    CFLAGS = {
        'darwin': ['-DPYICU_VER="%s"' %(VERSION), '-std=c++11']
    }
    
    LFLAGS = {
        'darwin': ['-L/usr/local/Cellar/icu4c/61.1/lib']
    }
    
    LIBRARIES = {
        'darwin': ['/usr/local/Cellar/icu4c/61.1/lib']
    }
    
  4. Сборка и установка пакета, т.е. python3 setup.py build и python3 setup.py install

Примечание. Если вы ранее пытались (безуспешно) собрать пакет, убедитесь, что вы сначала очистили содержимое build/ dir перед повторной сборкой, так как процесс сборки, кажется, пропускает создание новых файлов сборки, если он видит каталог, заполненный файлами из предыдущей сборки.

...