Включая файлы не-Python с setup.py

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

, Так как нам сказали принять a> = 0, и первое условие гарантирует, что b - (+ p)> = 0, на кронштейнах || тесты могут быть превращены в тесты против неравенства с 1:

(+ p < = b) & & (a! = 1) & & (b> = p) & & (b - p! = 1)

заманчиво удалить проверку (b> = p), который дал бы выражение nickf. И это - почти наверняка корректное практическое решение. К сожалению, мы должны знать больше о проблемной области перед способностью сказать, безопасно ли сделать это.

, Например, при использовании C и 32-разрядный неподписанный ints для типов a, b, и p, рассматривают случай где = 2^31 + 7, p = 2^31 + 5, b = 13. У нас есть a> 0, (+ p) = 12 < b, но b < p. (Я использую '^' для указания на возведение в степень, не C поразрядный xor.)

, Вероятно, Ваши значения не приблизятся к виду диапазонов, где этот вид переполнения является проблемой, но необходимо проверить это предположение. И если это оказывается возможностью, добавьте комментарий с тем выражением, объяснив это так, чтобы некоторый рьяный будущий оптимизатор небрежно не удалял (b> = p) тест.

172
задан SilentGhost 23 October 2009 в 11:57
поделиться

3 ответа

Вероятно, лучший способ сделать это - использовать директиву setuptools package_data . Это действительно означает использование setuptools (или distribute ) вместо distutils , но это очень плавное «обновление».

Вот полное (но непроверенное) ) пример:

from setuptools import setup, find_packages

setup(
    name='your_project_name',
    version='0.1',
    description='A description.',
    packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
    package_data={'': ['license.txt']},
    include_package_data=True,
    install_requires=[],
)

Обратите внимание на конкретные строчки, которые здесь важны:

package_data={'': ['license.txt']},
include_package_data=True,

package_data - это dict имен пакетов (пусто = все пакеты) к списку шаблонов (может включать глобусы) . Например, если вы хотите указать только файлы в своем пакете, вы тоже можете это сделать:

package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}

Решением здесь будет однозначно , а не переименование файлов, отличных от py , с .py расширение.

Подробнее см. презентация Яна Бикинга .

ОБНОВЛЕНИЕ: Другой [лучший] подход

Другой подход, который хорошо работает, если вы просто хотите контролировать содержимое исходного дистрибутива ( sdist ) и иметь файлы вне пакета (например, каталог верхнего уровня), - это добавьте файл MANIFEST.in . См. документацию Python , чтобы узнать о формате этого файла.

С момента написания этого ответа я обнаружил, что использование MANIFEST.in обычно менее разочаровывающий подход, чтобы просто убедиться, что ваш В дистрибутиве исходного кода ( tar.gz ) есть нужные вам файлы.

Например, если вы хотите включить requirements.txt с верхнего уровня, рекурсивно включите каталог «данных» верхнего уровня:

include requirements.txt
recursive-include data *

Тем не менее, чтобы эти файлы были скопированы во время установки в папку пакета внутри site-packages, вам нужно указать include_package_data = True в функцию setup () . См. Добавление файлов без кода для получения дополнительной информации.

187
ответ дан 23 November 2019 в 20:40
поделиться

Придумал обходной путь: я переименовал свой lgpl2.1_license.txt в lgpl2.1_license.txt.py и заключил в тройные кавычки текст. Теперь мне не нужно использовать параметр data_files или указывать какие-либо абсолютные пути. Я знаю, что делать его модулем Python некрасиво, но я считаю это менее уродливым, чем указание абсолютных путей.

-13
ответ дан 23 November 2019 в 20:40
поделиться

Чтобы выполнить то, что вы описываете, потребуется два шага ...

  • Файл должен быть добавлен в архив с исходным кодом
  • setup.py необходимо изменить, чтобы установить файл данных по исходному пути

Шаг 1. Чтобы добавить файл в исходный архив, включите его в МАНИФЕСТ

Создайте шаблон МАНИФЕСТ в папке, содержащей файл setup.py

МАНИФЕСТ - это в основном текстовый файл. со списком всех файлов, которые будут включены в исходный архив.

Вот как выглядит МАНИФЕСТ для моего проекта:

  • CHANGELOG.txt
  • INSTALL.txt
  • LICENSE.txt
  • pypreprocessor.py
  • README.txt
  • setup.py
  • test.py
  • TODO.txt

Примечание. Хотя sdist действительно добавляет некоторые файлы автоматически , я предпочитаю явно указывать их, чтобы быть уверенным, вместо того, чтобы предсказывать, что они делает и не делает.

Шаг 2: Чтобы установить файл данных в исходную папку, измените setup.py

Поскольку вы хотите добавить файл данных (LICENSE.txt) в исходную папку установки, вам необходимо изменить установку данных Путь к исходному пути установки. Это необходимо, потому что по умолчанию файлы данных устанавливаются в другое место, чем исходные файлы.

Чтобы изменить каталог установки данных, чтобы он соответствовал исходному каталогу установки ...

Получите информацию о каталоге установки из distutils с помощью:

from distutils.command.install import INSTALL_SCHEMES

Измените каталог установки данных, чтобы он соответствовал исходному каталогу установки:

for scheme in INSTALL_SCHEMES.values():
    scheme['data'] = scheme['purelib']

И, добавьте файл данных и его местоположение в setup ():

data_files=[('', ['LICENSE.txt'])]

Примечание. Приведенные выше шаги должны выполнять в точности то, что вы описали стандартным способом, без использования каких-либо библиотек расширений.

43
ответ дан 23 November 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: