включить дополнительный файл в пакет Python с помощью setuptools - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь построить колесо python, используя setuptools. Пакет должен включать два файла:

  • mymodule.py - модуль python в том же каталоге, что и setup.py
  • myjar.jar - java .jar файл, который существует вне моего каталога пакетов

Я создаю свой пакет, используя python3 setup.py bdist_wheel.

Если я позвоню setup() вот так:

setup(
    name="mypkg",
    py_modules=["mymodule"],
    data_files=[('jars', ['../target/scala-2.11/myjar.jar'])]
)

тогда myjar.jar успешно включается в .whl (пока хорошо), однако, когда я pip install mypkg он помещает банку в /usr/local/myjar.jar ( этот вроде как объясняет, почему), что не то, что я вообще хочу, я хочу, чтобы он существовал там же, где и mymodule.py, т.е. /usr/local/lib/python3.7/site-packages/

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

setup(
    name="mypkg",
    py_modules=["mymodule"],
    package_data={'jars': '../target/scala-2.11/myjar.jar'}
)

или

setup(
    name="mypkg",
    py_modules=["mymodule"],
    package_data={'jars': ['../target/scala-2.11/myjar.jar']}
)

, тогда myjar.jar просто не включается в .whl. Я попытался скопировать myjar.jar в тот же каталог и изменить setup.py на:

setup(
    name="mypkg",
    py_modules=["mymodule"],
    package_data={'jars': 'myjar.jar'}
)

или

setup(
    name="mypkg",
    py_modules=["mymodule"],
    package_data={'jars': ['myjar.jar']}
)

, но все же myjar.jar не включается в .whl.

Я часами рвал себе волосы, вот почему я здесь.

Я прочитал множество сообщений SO по этому поводу:

которые предлагают различные комбинации data_files, package_data, include_package_data=True и / или использование файла Manifest.in, но все же я не могу заставить это работать так, как хотелось бы, поэтому я здесь надеюсь, что кто-то может посоветовать что я делаю не так.

1 Ответ

1 голос
/ 07 мая 2020

Файлы данных (в данном случае myjar.jar) действительно должны быть файлами данных пакета , и как таковые они должны быть частью пакета Python. Таким образом, наличие таких файлов в родительских каталогах значительно усложняет задачу, но, вероятно, не делает невозможной. Итак, начнем с более простого примера. Я считаю, что что-то вроде следующего должно работать ...

Структура каталогов проекта:

MyProject
├ MANIFEST.in
├ mymodule.py
├ setup.py
└ myjars
    ├ __init__.py
    └ myjar.jar

MANIFEST.in:

recursive-include myjars *.jar

setup.py:

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    name='MyProject',
    version='1.2.3',
    #
    include_package_data=True,
    packages=['myjars'],
    py_modules=["mymodule"],
)

myjars/__init__.py может и не быть строго необходимым, но я считаю, что лучше иметь его. И, как всегда, вполне достаточно пустого файла __init__.py.

(Предполагается, что файл myjars/myjar.jar существует до того, как будет собран исходный дистрибутив sdist.)

Что касается работы с файлами данных в родительских каталогах, я бы рекомендовал просто скопировать (или создать символическую ссылку) эти файлы перед вызовом setup.py, возможно, как часть сценария оболочки или чего-то подобного. Вероятно, есть способы сделать копию как часть пользовательской команды setuptools в setup.py, но, на мой взгляд, это не стоит усилий, и на самом деле это не часть работы setup.py.

...