Ошибка при установке Pants pex: "FAILURE: невозможно определить подходящий интерпретатор совместимости: (конфликтующие цели:)"

Я использую штаны версии 0.0.32 + еще несколько коммитов от мастера.

Я хочу использовать pex-дистрибутив, включающий поддержку как Linux, так и MacOS. Я строю pex из репозитория Pants OSS, используя:

git clean -fdx
PANTS_DEV=1 ./pants binary ./src/python/pants/bin:pants

Я взял только что созданный файл dist /ants.pex, и он отлично работает на моем Mac. Когда я пытаюсь запустить его в моей среде Linux, он выходит с ошибкой:

./pants test foo
Running Pants version square-20150331-02
...
11:53:22 00:08     [pytest]
11:53:22 00:08       [run]
                 WARN] /data/app/kochiku-worker/.pex/install/requests-2.5.3-py2.py3-none-any.whl.ed9d28acc3c467062b25b9dc2e2084d6efa8ee1e/requests-2.5.3-py2.py3-none-any.whl/requests/packages/urllib3/connection.py:251: SecurityWarning: Certificate has no `subjectAltName`, falling back to check for a `commonName` for now. This feature is being removed by major browsers and deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 for details.)
  SecurityWarning


FAILURE: Unable to detect a suitable interpreter for compatibilities:  (Conflicting targets: )

[32m
           Waiting for background workers to finish.[0m[31m
           FAILURE[0m

Я думаю, что здесь происходит то, что по какой-то причине брюки работают под Python 2.6. Я исследовал ошибку безопасности, и кажется, что она может быть случайно отключена при использовании версии Python более ранней, чем Python 2.7.2. Версия python, установленная на машине, которую я пытаюсь использовать, установлена ​​в /usr/local/bin и является версией 2.7.9.

2 ответа

Решение

ОК - Grepping для этого сообщения об ошибке в версии 0.0.32 Я нахожу этот код python_task.py:

def select_interpreter_for_targets(self, targets):
  """Pick an interpreter compatible with all the specified targets."""
  allowed_interpreters = OrderedSet(self.interpreter_cache.interpreters)
  targets_with_compatibilities = []  # Used only for error messages.

  # Constrain allowed_interpreters based on each target's compatibility requirements.
  for target in targets:
    if target.is_python and hasattr(target, 'compatibility') and target.compatibility:
      targets_with_compatibilities.append(target)
      compatible_with_target = list(self.interpreter_cache.matches(target.compatibility))
      allowed_interpreters &= compatible_with_target

  if not allowed_interpreters:
    # Create a helpful error message.
    unique_compatibilities = set(tuple(t.compatibility) for t in targets_with_compatibilities)
    unique_compatibilities_strs = [','.join(x) for x in unique_compatibilities if x]
    targets_with_compatibilities_strs = [str(t) for t in targets_with_compatibilities]
    raise TaskError('Unable to detect a suitable interpreter for compatibilities: %s '
                    '(Conflicting targets: %s)' % (' && '.join(unique_compatibilities_strs),
                                                   ', '.join(targets_with_compatibilities_strs)))

allowed_interpreters вернулся пустым из interpreter_cache и этот код просматривает значения конфигурации, чьи ключи были недавно изменены, чтобы загрузить интерпретаторы. Я предполагаю, что у вас есть pants.ini Конфиг в вашем репо, в котором отсутствует изменение имени ключа.

Есть инструмент для проверки на несвежие pants.ini Конфиг-ключи в репозитории брюк Вы можете запустить его в клоне брюк / репо брюк, указывая на свои репо. pants.ini вот так:

$ ./pants run src/python/pants/option/:migrate_config -- [path to your repo's pants.ini]

Я сделал это недавно, когда обновлял твиттер / достояние. Изменение было рассмотрено здесь, и вывод инструмента выглядел так:

$ ./pants run src/python/pants/option/:migrate_config -- ~/dev-jsirois-commons/pants.ini
...
17:53:44 00:00   [run]
17:53:44 00:00     [py]
17:53:44 00:00       [chroot]
17:53:44 00:00       [run]
Checking config file at /home/jsirois/dev-jsirois-commons/pants.ini for unmigrated keys.
Found indices in section [python-repos]. Should be indexes in section [python-repos].

17:53:44 00:00     [jvm]
17:53:44 00:00     [cpp-run]
               SUCCESS

Обратите внимание Found indices in section [python-repos]. Should be indexes in section [python-repos], Скорее всего, у вас есть такой же немигрированный inidices ключ сбивает вас с толку.

Вы можете работать с переменной окружения PEX_VERBOSE=1 - это даст вам больше информации о том, с какой версией Python вы работаете. Ваш системный Python также может быть неправильно настроен для использования библиотек из 2.6.

В качестве ядерного варианта вы можете попробовать https://github.com/wickman/python-bootstrap/blob/master/bootstrap_python.sh проверить, поможет ли это исправить вашу среду Python.

Другие вопросы по тегам