Создание пакета с несколькими python файлами - PullRequest
0 голосов
/ 15 января 2020

У меня есть структура папок:

setup_seplot.py
seplot/
        __init__.py      (empty)
        seplot.py
        kw_dictionaries.py

В seplot.py у меня есть:

import kw_dictionaries as kd

Если я запускаю seplot.py, все работает хорошо.

Однако при использовании setup_seplot.py возникает проблема:

python setup_seplot.py sdist bdist_wheel
Traceback (most recent call last):
  File "setup_seplot.py", line 2, in <module>
    from seplot import seplot as sep
  File "/home/XXXXX/code/Python-Tools/seplot/seplot.py", line 14, in <module>
    import kw_dictionaries as kd
ModuleNotFoundError: No module named 'kw_dictionaries'

Эта проблема возникает из-за того, что в setup_seplot я импортирую seplot для получения версии:

setup_seplot.py:

from setuptools import setup, Extension, find_packages
from seplot import seplot as sep

version=sep.__VERSION__
setup(
     name='seplot',
     version=version,
     description="A front-end for Python PyX",
     install_requires=[ 'pyx', ],
     packages=find_packages(),
     scripts=['seplot/bin/seplot','seplot/seplot.py',
        'seplot/kw_dictionaries.py','seplot/style_dictionaries.py']
 )

Если в seplot.py я заменяю

import kw_dictionaries as kd

на:

from . import kw_dictionaries as kd

Тогда установка работает нормально, но код ( setup.py) нет. Я совершенно заблудился здесь.

Ответы [ 2 ]

0 голосов
/ 16 января 2020
  • Храните ваши сценарии и пакеты , разделенные с помощью старого стиля scripts от distutils . Или, что еще лучше, используйте console_scripts точки входа из setuptools .
  • Всегда используйте абсолютный импорт в исполняемых скриптах (если у вас есть любой).
  • Используйте абсолютный или относительный импорт в пакетах по своему усмотрению (я считаю, что абсолютный лучше в долгосрочной перспективе).
  • В сценарии установки не импортируйте пакеты из проэкт. Сохраните строку версии в setup.cfg (или setup.py) и используйте importlib_metadata.version('ProjectName') для чтения из вашего фактического кода.
0 голосов
/ 16 января 2020

Решение было найдено в: другой топи c в соответствии с предложением Гохта .

Это кажется хакерским, и я не понимаю, почему, но это работает:

if __package__:
    import seplot.kw_dictionaries as kd
else:
    import kw_dictionaries as kd
...