2010-10-07 5 views
3

Я попытался упаковать приложение django сегодня. Это большой ребенок, и с установочным файлом мне приходится вручную записывать все пакеты и подпакеты в параметр «package». Затем мне нужно найти способ копирования светильников, файлов htmls/Css/изображений, документации и т. Д.Есть ли более простой способ упаковки с Python?

Это ужасный способ работать. Мы компьютерные ученые, мы автоматизируем, делать это не имеет смысла.

И что, когда я меняю структуру своего приложения? Мне нужно переписать setup.py.

Есть ли лучший способ? Какой-то инструмент для автоматизации этого? Я не могу поверить языку, чем значение времени разработки, например, Python делает упаковку такой сложной задачей.

Я хочу, чтобы в конечном итоге можно было установить приложение, используя простую установку pip. Я знаю о создании, но это не намного проще, и это не дружелюбно.

ответ

5

По крайней мере, если вы используете setuptools (альтернатива к STDLIB-х distutils) Вы получаете удивительную функцию под названием find_packages(), которая, когда выбежала из корня пакета возвращает список имен пакетов в дот-нотации, подходящих для параметра packages.

Вот пример:

# setup.py 

from setuptools import find_packages, setup 

setup(
    #... 
    packages=find_packages(exclude='tests'), 
    #... 
) 

P.S. Упаковка отстойна на каждом языке и в каждой системе. Это отстой, независимо от того, как вы его разрезаете.

+0

+1, спасибо за советы. –

+0

У вас есть такой совет для файлов satic, таких как po, html/css и doc, которые я должен включить вручную? Может быть setuptools.findall? Если вы это сделаете, я соглашусь с вашим собеседником. –

+1

Вы можете указать их с помощью 'package_data' (http://docs.python.org/distutils/setupscript.html#installing-package-data) или' data_files'. (Http://docs.python.org/distutils /setupscript.html#installing-additional-files). Например, если для 'data_files' установлено значение' [('share/mypackage', ['test.html'])] ', после установки' test.html' будет скопирован в '/ usr/share/mypackage' (если ваш префикс'/usr/share'). – jathanism

0

Я думаю, что инструмент, который вы ищете, это Buildout. Там много мест, где вы можете узнать больше об этом, от SlideShare до Pycon videos.

Другие аналогичные или связанные с ними инструменты, которые вы можете проверить, включают virtualenv, Fabric, and PIP.

+0

Можете ли вы попробовать установить что-то в комплекте со сборкой? Я не хочу предоставлять пакет, который требует больше, чем установка pip в virtualenv. –

+0

Поиск. Да, ты можешь. Но мой, построение - это все, но простое в использовании. Это огромная, с бесплатной документацией и на основе текстового файла вместо файлов python. –

+0

Я не могу не согласиться с вашим описанием, я думаю, что вы на месте. Я просто не знаю, что еще рекомендовать, что лучше подходит :( – ewall

1

Я сам пережил эту боль сегодня. Я использовал следующий, yoinked прямо из Django's setup.py, который ходит к файловой системе приложения ищет пакеты и файлы данных (при условии, что вы никогда не смешивать два):

import os 
from distutils.command.install import INSTALL_SCHEMES 

def fullsplit(path, result=None): 
    """ 
    Split a pathname into components (the opposite of os.path.join) in a 
    platform-neutral way. 
    """ 
    if result is None: 
     result = [] 
    head, tail = os.path.split(path) 
    if head == '': 
     return [tail] + result 
    if head == path: 
     return result 
    return fullsplit(head, [tail] + result) 

# Tell distutils to put the data_files in platform-specific installation 
# locations. See here for an explanation: 
# http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb 
for scheme in INSTALL_SCHEMES.values(): 
    scheme['data'] = scheme['purelib'] 

# Compile the list of packages available, because distutils doesn't have 
# an easy way to do this. 
packages, data_files = [], [] 
root_dir = os.path.dirname(__file__) 
if root_dir != '': 
    os.chdir(root_dir) 
myapp_dir = 'myapp' 

for dirpath, dirnames, filenames in os.walk(myapp_dir): 
    # Ignore dirnames that start with '.' 
    for i, dirname in enumerate(dirnames): 
     if dirname.startswith('.'): del dirnames[i] 
    if '__init__.py' in filenames: 
     packages.append('.'.join(fullsplit(dirpath))) 
    elif filenames: 
     data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]]) 
+0

Это блестящий! Я попробую это. Если это сработает, я соглашусь с anwser. –

-1

Я делал несколько исследований, сам по развертыванию Django методов в последнее время.

Я нашел эти два ресурса очень полезные:

+0

Это не совсем полезно для этого вопроса. отлично подходит для меня. Упаковка - это раздражающая часть. –

+0

Ссылки, которые я опубликовал, дают хорошее представление о методах упаковки. Мне жаль, что вы не нашли ссылки полезными и решили спуститься вниз. –

Смежные вопросы