Как включить файлы, отличные от python, и установить их вместе с пакетом? [Дубликат]

У вас есть два варианта: запишите свои изменения:

git stash

, а затем, чтобы вернуть их:

git stash apply

или поместить свои изменения в ветку, чтобы вы могли получить удаленной ветви, а затем объединить изменения на ней. Это одна из самых больших вещей в git: вы можете сделать ветку, зафиксировать ее, а затем внести другие изменения в ветку, в которой вы были.

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

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

7 ответов

Вероятно, лучший способ сделать это - использовать директиву 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 имен пакетов ( empty = all packages) в список шаблонов (может включать в себя глобусы). Например, если вы хотите указывать только файлы внутри своего пакета, вы также можете это сделать:

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

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

Для получения дополнительной информации см. презентацию Ian Bicking .

UPDATE: другой [лучший] подход

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

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

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

include requirements.txt
recursive-include data *

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

134
ответ дан Ciprian Tomoiagă 26 August 2018 в 08:32
поделиться
  • 1
    package_data также доступен для чистых сценариев установки distutils с Python 2.3. – Éric Araujo 9 December 2011 в 18:12
  • 2
    Этот ответ выглядит разумным, но не работает для меня. Поскольку package_data, как известно, ненадежна (требуется согласование файлов MANIFEST.in и setup.py для добавления файлов в sdist и их установки в виде отдельных шагов), и автор этого ответа отмечает, что он «не проверен», может кто-нибудь еще подтверждает, работает ли это на них? Мой файл LICENSE включен в sdist, но не установлен, когда я запускаю «python setup.py install & quot; ни "пакет установки пакета" – Jonathan Hartley 12 February 2012 в 13:07
  • 3
    В презентации Ian Bicking показано, как устанавливать пакетные данные для файлов, находящихся в пакете. Мой файл LICENSE находится на верхнем уровне моего проекта, то есть не в каких-либо пакетах. Могу ли я использовать package_data? Использование data_files является не стартером, поскольку оно помещает файлы в общесистемное расположение. не связанный с моим проектом, и для того, чтобы усугубить ситуацию, изменение местоположения в зависимости от того, запускаю ли я setup.py install & quot; или "установить пакет" из одного и того же sdist. – Jonathan Hartley 12 February 2012 в 13:09
  • 4
    Я предполагаю, что причина, по которой он не работает для меня, заключается в том, что файл не находится в каком-либо пакете - это файл LICENSE на верхнем уровне репозитория и, следовательно, не может быть установлен с использованием 'package_data' – Jonathan Hartley 12 February 2012 в 17:25
  • 5
    Этот ответ не работает для меня. Дополнительные файлы не попадают в архив ... – lpapp 26 November 2013 в 16:13

создайте MANIFEST.in в корне проекта с recursive-include в требуемый каталог или include с именем файла.

include LICENSE
include README.rst
recursive-include package/static *
recursive-include package/templates *

документация находится здесь

2
ответ дан All Іѕ Vаиітy 26 August 2018 в 08:32
поделиться

В setup.py при настройке (:

setup(
   name = 'foo library'
   ...
  package_data={
   'foolibrary.folderA': ['*'],     # All files from folder A
   'foolibrary.folderB': ['*.txt']  #All text files from folder B
   },
5
ответ дан Dashing Adam Hughes 26 August 2018 в 08:32
поделиться

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

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

Шаг 1: Чтобы добавить файл в исходный архив, включите его в MANIFEST

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

MANIFEST - это в основном текстовый файл со списком всех файлов, которые будут включены в исходный архив.

Вот как выглядит MANIFEST для моего проекта:

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

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

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

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

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

Pull информацию об установочном директории от distutils с помощью:

from distutils.command.install import INSTALL_SCHEMES

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

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

И добавьте файл данных и местоположение для настройки ():

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

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

39
ответ дан Evan Plaice 26 August 2018 в 08:32
поделиться
  • 1
    MANIFEST управляет только файлами, включенными в исходный tarball (созданный sdist). Файлы, перечисленные там, не будут установлены. – David Cournapeau 17 November 2010 в 08:56
  • 2
    @David, я не понимал, как далеко я был в моем первом подходе. Я обновил ответ, чтобы быть правильным, чтобы решить вопрос, не требуя каких-либо дополнительных сторонних библиотек. – Evan Plaice 19 November 2010 в 15:21
  • 3
    @ Éric Любая конкретная причина почему? и у вас есть жизнеспособная альтернатива установщика, которая не требует работы сторонних пакетов (например, setup_tools). Я выбрал distutils над setuptools, потому что он включен с ванильной установкой python, и я строил модули для PYPI. Должен быть лучший способ сделать это сейчас, используя distutils2, но я не дотронулся до python через некоторое время, поэтому я не знал бы, как это сделать. Поскольку вы, похоже, хорошо осведомлены о distutils2, я думаю, что для всех нас было бы полезно иметь альтернативу distutils2. – Evan Plaice 15 December 2011 в 00:16
  • 4
    Как уже упоминалось в других потоках package_data, не работает, если файл отсутствует в пакете. – Gringo Suave 3 January 2013 в 00:50
  • 5
    @ ÉricAraujo: Неплохая идея использовать это решение, поскольку другого выхода нет. Это плохой дизайн distutils - это правда. Но это де-факто открытый API, который никогда не изменится, потому что он сломает много вещей. Будем надеяться, что distutils2 предоставит более рекомендуемые способы. – anatoly techtonik 9 June 2013 в 08:20

Вот более простой ответ, который сработал для меня.

Во-первых, за комментарий Python Dev выше, setuptools не требуется:

package_data is also available to pure distutils setup scripts 
since 2.3. – Éric Araujo

Это здорово, потому что установка требования setuptools на ваш пакет означает, что вам также придется его установить. Короче:

from distutils.core import setup

setup(
    # ...snip...
    packages          = ['pkgname'],
    package_data      = {'pkgname': ['license.txt']},
)
3
ответ дан Gringo Suave 26 August 2018 в 08:32
поделиться
  • 1
    Он будет жаловаться, что каталог pkgame не существует – Anthony Kong 5 January 2016 в 06:01

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

-14
ответ дан Ram Rachum 26 August 2018 в 08:32
поделиться
  • 1
    Смотрите мой пост. Это не должно быть уродливым. Просто найти хороший пример в сети, потому что хорошей документации по настройке пакетов сложно найти. – Evan Plaice 15 June 2010 в 05:05

Я просто хотел следить за тем, что я нашел, работая с Python 2.7 на Centos 6. Добавление пакетов_данных или data_files, как упоминалось выше, не помогло мне. Я добавил MANIFEST.IN с файлами, которые я хотел, которые помещали файлы, отличные от python, в tarball, но не устанавливали их на целевой машине через RPM.

В конце концов, мне удалось получить файлы в моем решении, используя «параметры» в setup / setuptools. Файлы параметров позволяют изменять различные разделы файла spec из файла setup.py. Как показано ниже.

from setuptools import setup


setup(
    name='theProjectName',
    version='1',
    packages=['thePackage'],
    url='',
    license='',
    author='me',
    author_email='me@email.com',
    description='',
    options={'bdist_rpm': {'install_script': 'filewithinstallcommands'}},
)

file - MANIFEST.in:

include license.txt

file - filewithinstallcommands:

mkdir -p $RPM_BUILD_ROOT/pathtoinstall/
#this line installs your python files
python setup.py install -O1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES
#install license.txt into /pathtoinstall folder
install -m 700 license.txt $RPM_BUILD_ROOT/pathtoinstall/
echo /pathtoinstall/license.txt >> INSTALLED_FILES
1
ответ дан Scott Bowers 26 August 2018 в 08:32
поделиться
Другие вопросы по тегам:

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