Исполняемые скрипты Python, установленные с помощью `console_scripts` с использованием` pip install -e .`, можно найти в пути, но не в `pip install .` - PullRequest
0 голосов
/ 08 мая 2018

У меня есть структура папок, подобная этой

working folder
├── my_package
│   ├── __init__.py
│   ├── modules.py
├── scripts
│   ├── abc
│   └── def
└── setup.py

и попытался написать

scripts=[
      'scripts/abc',
      'scripts/def'
  ]

в setup.py, но мой коллега, использующий Windows, жаловался, что это было нелегко вызвать. Поскольку я хочу сделать свой пакет кроссплатформенным, я попытался следовать инструкциям console_scripts точки входа , но мне, похоже, потребовалось поместить abc.py и def.py внутри my_package. Тем не менее, я хочу сохранить структуру папок. Поэтому я попытался написать

entry_points={
      'console_scripts': [
          'abc=scripts.abc:main',
          'def=scripts.def:main'
      ]}

in setup.py и abc могут быть вызваны, если этот пакет установлен с использованием pip install -e . (где . указывает на working folder), но я не могу вызвать его, если установлен с pip install .. Это сообщило бы о некоторой ошибке:

Traceback (most recent call last):
  File "/Users/xx/.pyenv/versions/3.6.0/bin/abc", line 11, in <module>
    load_entry_point('my_package==1.0.6', 'console_scripts', 'abc')()
  File "/Users/xx/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pkg_resources/__init__.py", line 565, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/Users/xx/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2631, in load_entry_point
    return ep.load()
  File "/Users/xx/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2291, in load
    return self.resolve()
  File "/Users/xx/.pyenv/versions/3.6.0/lib/python3.6/site-packages/pkg_resources/__init__.py", line 2297, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
ModuleNotFoundError: No module named 'scripts'

Понятия не имею, что вызвало эту проблему. Я правильно использую console_scripts? В чем разница между pip install . и pip install -e .? Я набрал python -m site, и их пути одинаковы. Кстати, я использую Python 3.6.0, установленный локально через pyenv на macOS 10.12 +.

1 Ответ

0 голосов
/ 08 мая 2018

Поскольку у вас есть scripts вне пространства имен вашего основного проекта my_package, он просто не будет упакован, если не объявлен как таковой в setup.py (но этого делать не следует, так как это общее имя будет просто сталкиваются с другими пакетами, которые делают эту же ошибку). Очевидный способ исправить это - переместить все модули Python (например, scripts/abc.py) в пространство имен вашего пакета и изменить точку входа 'abc=scripts.abc:main' в 'abc=my_package.abc:main', повторно выполнить этап разработки / редактирования (например, pip install -e .), чтобы увидеть что он все еще работает, затем упакуйте его (например, python setup.py bdist_wheel, чтобы увидеть, что эти файлы были упакованы в .whl; или используйте pip install .), чтобы убедиться, что он все еще работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...