Как сделать, чтобы setup.py
включить файл, который не является частью кода? (В частности, это файл лицензии, но это может быть любая другая вещь.)
Я хочу иметь возможность контролировать местоположение файла. В исходной исходной папке файл находится в корне пакета. (то есть на том же уровне, что и верхний __init__.py
.) Я хочу, чтобы он оставался именно там, когда пакет установлен, независимо от операционной системы. Как я могу это сделать?
data_files = [('', ['lgpl2.1_license.txt',]),]
помещает его в папку Python26.Ответы:
Вероятно, лучший способ сделать это - использовать
setuptools
package_data
директиву. Это означает использованиеsetuptools
(илиdistribute
) вместоdistutils
, но это очень плавное «обновление».Вот полный (но не проверенный) пример:
Обратите внимание на конкретные строки, которые здесь важны:
package_data
являетсяdict
именем пакета (пусто = все пакеты) в списке шаблонов (может включать глобусы). Например, если вы хотите указать только файлы в вашем пакете, вы можете сделать это тоже:Решение здесь определенно не в том, чтобы переименовывать ваши не
py
файлы с.py
расширением.Смотрите презентацию Яна Бикинга для получения дополнительной информации.
ОБНОВЛЕНИЕ: другой [лучший] подход
Другой подход, который работает хорошо, если вы просто хотите контролировать содержимое исходного дистрибутива (
sdist
) и иметь файлы вне пакета (например, каталог верхнего уровня), - это добавитьMANIFEST.in
файл. См. Документацию Python для формата этого файла.С тех пор, как я написал этот ответ, я обнаружил, что использование,
MANIFEST.in
как правило, менее разочаровывающий подход - просто убедиться, что ваш исходный дистрибутив (tar.gz
) имеет нужные вам файлы.Например, если вы хотите включить
requirements.txt
из верхнего уровня, рекурсивно включите каталог «данных» верхнего уровня:Тем не менее, для того, чтобы эти файлы были скопированы во время установки в папку пакета внутри site-пакетов, вам необходимо предоставить
include_package_data=True
этуsetup()
функцию. См. Добавление файлов без кода для получения дополнительной информации.источник
Чтобы выполнить то, что вы описываете, потребуется два шага ...
Шаг 1: Чтобы добавить файл в исходный архив, включите его в MANIFEST
Создайте шаблон MANIFEST в папке, содержащей setup.py
MANIFEST - это текстовый файл со списком всех файлов, которые будут включены в исходный архив.
Вот как выглядит МАНИФЕСТ для моего проекта:
Примечание: В то время как sdist делает добавить некоторые файлы в автоматическом режиме , я предпочитаю , чтобы явно указать их , чтобы убедиться , вместо того , чтобы предсказать , что он делает и не делает.
Шаг 2. Чтобы установить файл данных в исходную папку, измените файл setup.py
Поскольку вы хотите добавить файл данных (LICENSE.txt) в исходную папку установки, вам нужно изменить путь установки данных, чтобы он соответствовал пути установки источника. Это необходимо, поскольку по умолчанию файлы данных устанавливаются в другое место, чем исходные файлы.
Чтобы изменить каталог установки данных в соответствии с каталогом установки источника ...
Извлеките информацию установочного каталога из distutils с помощью:
Измените каталог установки данных в соответствии с каталогом установки источника:
И добавьте файл данных и местоположение в setup ():
Примечание. Приведенные выше действия должны выполнять то, что вы описали стандартным образом, без каких-либо библиотек расширений.
источник
package_data
не работает, если файл не входит в пакет.создать
MANIFEST.in
в корне проекта сrecursive-include
нужным каталогом илиinclude
с именем файла.документацию можно найти здесь
источник
Я хотел оставить комментарий к одному из вопросов, но у меня недостаточно репутации, чтобы сделать это>.>
Вот что сработало для меня (придумал это после обращения к документации):
Последняя строка была, как ни странно, также крайне важной для меня (вы также можете опустить этот аргумент ключевого слова - он работает так же).
Он копирует все текстовые файлы в вашем верхнем или корневом каталоге (на один уровень выше от пакета, который
mypkg
вы хотите распространять).Надеюсь это поможет!
источник
MANIFEST.in
, это работало для меня. Последняя строчка также имела решающее значение для меня. Мои строки былиinclude_package_data=False, package_data={ "": ["../CHANGELOG.md"] },
Это 2019 год, и вот что работает - несмотря на то, что советы здесь и там, то, что я нашел в интернете на полпути, документировано, используется
setuptools_scm
, и передается как опцияsetuptools.setup
. Это будет включать любые файлы данных, которые являются версиями на вашей VCS, будь то git или любые другие, в пакет wheel, и будет выполнять «pip install» из репозитория git, чтобы привести эти файлы вместе.Итак, я просто добавил эти две строки в вызов установки «setup.py». Никаких дополнительных установок или импорта не требуется:
Нет необходимости вручную указывать package_data или в файле MANIFEST.in - если он версионный, он включается в пакет. В документах «setuptools_scm» делается акцент на создании номера версии из позиции фиксации и не учитывается действительно важная часть добавления файлов данных. (Меня не волнует, если мой файл промежуточного колеса называется «* 0.2.2.dev45 + g3495a1f» или будет использовать номер версии в жестком коде «0.3.0dev0», который я набрал - но оставляю важные файлы для программы, чтобы работа позади несколько важна)
источник
Шаг 1: создайте
MANIFEST.in
файл в той же папке с setup.pyШаг 2: включите относительный путь к файлам, которые вы хотите добавить в
MANIFEST.in
Шаг 3: установите
include_package_data=True
вsetup()
функции копирование этих файлов в сайт-пакетСсылка здесь.
источник
В setup.py под настройку (:
источник
package_data
будет влиять на тоsetup.py install
, что делает, если вы не измените саму команду установки. Если эти файлы не находятся в каталоге пакета, чего обычно вам следует избегать.Вот более простой ответ, который работал для меня.
Во-первых, согласно комментарию Python Dev выше, setuptools не требуется:
Это замечательно, потому что, установив требование setuptools на ваш пакет, вы также должны будете установить его. Коротко:
источник
pkgame
не существуетЯ просто хотел продолжить что-то, что я нашел, работая с Python 2.7 на Centos 6. Добавление package_data или data_files, как упомянуто выше, не работает для меня. Я добавил MANIFEST.IN с нужными мне файлами, которые помещают файлы, отличные от python, в tarball, но не устанавливал их на целевой машине через RPM.
В итоге я смог получить файлы в своем решении, используя «опции» в setup / setuptools. Файлы опций позволяют вам изменять различные разделы спецификационного файла из setup.py. Следующим образом.
файл - MANIFEST.in:
файл - файл с командами установки:
источник
Разобравшись с обходным путем: я переименовал свое имя
lgpl2.1_license.txt
вlgpl2.1_license.txt.py
, и поместил несколько тройных кавычек вокруг текста. Теперь мне не нужноdata_files
ни использовать эту опцию, ни указывать абсолютные пути. Я знаю, что сделать его модулем Python некрасиво, но считаю его менее уродливым, чем указание абсолютных путей.источник