Пакеты пространства имен Python не видны в локальном проекте разработки - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь разбить большой (почти монолитный) проект Python на несколько частей, используя Pythons пакетов пространства имен . Поэтому я извлек парсер для *.rules файлов в пакет пространства имен . Python называет это дистрибутивом .

Я следовал этому руководству и, насколько я могу судить, он частично работает, но ...

Короче: В основном проекте пространства имен отдельно распределенных пакетов пространств имен не видны, поскольку при поиске пакетов сначала выполняется поиск локальных пакетов, а не слияние с системными пакетами из site-packages.

Структура проекта

Вот часть моего каталога / пакета и структуры модуля.

Основной проект:

pyIPCMI/                  # Git repository root
  pyIPCMI/
    __init__.py
    Common/
      __init__.py
      File1.py
    Compiler/
      __init__.py
      Vendor1.py
      Vendor2.py
  setup.py

Распространение для парсера правил

pyIPCMI.Parser.Rules/     # Git repository root
  pyIPCMI/
    Parser/
      Rules/
        __init__.py
        Parser.py
  setup.py

Описания пакетов (setuptools)

Основной проект упакован следующим образом:

import setuptools

setuptools.setup(
  name="pyIPCMI",
  version="1.1.5",
  author="Paebbels",
  author_email="abc@xyz.de",
  description="",
  long_description="",
  url="https://github.com/Paebbels/pyIPCMI",

  packages=setuptools.find_packages(),

  classifiers=["License :: OSI Approved :: Apache Software License"],
  python_requires='>=3.5',
  install_requires=[],
)

Встроенное пространство именупакован так:

import setuptools

namespace =   ["pyIPCMI", "Parser", "Rules"]

setuptools.setup(
  name=".".join(namespace),
  version="1.1.4",
  author="Paebbels",
  author_email="abc@xyz.de",
  description="",
  long_description="",
  url="https://github.com/Paebbels/pyIPCMI.Parser.Rules",

  packages=setuptools.find_namespace_packages(
    include=[".".join(namespace), ".".join(namespace) + ".*"]
  ),
  namespace_packages=namespace[0:1],

  classifiers=["License :: OSI Approved :: Apache Software License"],
  python_requires='>=3.5',
  install_requires=[],
)

Все дистрибутивы были:

  • упакованы с setuptools с использованием Travis-CI
  • , развернутым в PyPI, изатем
  • устанавливается на локальном компьютере с использованием pip.

Namespace Структура в PyPI

pyIPCMI
pyIPCMI.Parser.Files
pyIPCMI.Parser.Rules
pyIPCMI.Toolchains
pyIPCMI.Toolchains.Vendor1
pyIPCMI.Toolchains.Vendor2

Описание проблемы

При разработке в основном проекте с использованием, например, PyCharm, локально найденные пространства имен предпочтительнее пакетов из site-packages. Более того, эти пространства имен не объединяются. Поскольку основной проект имеет то же корневое пространство имен pyIPCMI, поиск продолжается в локальном проекте разработки, но не выполняется поиск в site-packages.

Есть идеи, как можно разработать главный проект?


Пожалуйста, сообщите, какая информация необходима для решения этого вопроса. Я пытался записать всю имеющуюся у меня информацию. Но этот вопрос может нуждаться в улучшении, чтобы получить решение.

1 Ответ

0 голосов
/ 14 октября 2019

Насколько я знаю, пакеты пространства имен должны быть действительно пустыми, и это во всех установленных проектах.

Очевидно, ваш pyIPCMI проект имеет верхний уровень non-namespace-package pyIPCMI, то есть у вас есть файл pyIPCMI/__init__.py. Поэтому я не думаю, что у вас может быть пакет пространства имен pyIPCMI в других проектах. Я бы попытался удалить этот файл pyIPCMI/__init__.py (и сделать его также пакетом пространства имен), если вы хотите, чтобы pyIPCMI был пакетом пространства имен в других проектах.

...