Найти - Пользователи
Полная версия: сборка пакета.
Начало » Python для новичков » сборка пакета.
1
soln
Здравствуйте.
Нужна ваша помощь.
Решил собрать с помощью Distribute пакет.
Со следующей структурой:
pkg/
    __init__.py
    script.py
    a/
        __init__.py
        test.py
        c/
            __init__.py
            test.py 
    b/
        __init__.py
        test

В корневом __init__.py
from pkg.a.test import test
from pkg.a.c.test import test as three
from pkg.b.test import test as two

setup.py
 #!/usr/bin/env python
 #-*- coding: utf-8 -*-
 
 from setuptools import setup, find_packages
 from os.path import join, dirname
 
 PACKAGE = 'pkg'
 setup(
     name='pkg',
     version='1.0',
     scripts = ['script.py'],
     packages= find_packages(),
 )
 

Проблема в том, что если собирать пакет находясь непосредственно в корневом котологе пакета pkg., то собирается все кроме кроме pkg.
То есть, find_packedg возращает следующее
['a', 'b', 'a.c']
Однако, если собирать пакет из каталога выше, то пакет pkg собирается, и я получаю желаемую структуру
  ['pkg', 'pkg.a', 'pkg.b', 'pkg.a.c'] 
. Однако, мы же понимаем, что каталогом выше может оказатся что угодно.

Вопрос: как получить структуру где есть общее пространство имен (pkg), в которое импортировать уже другие пакеты (a, b, c) с модулями?


s0rg
А что вам мешает создать директорию (например pkg_dist) и положить в нее pkg/* и setup.py?
soln
Да ничего.
Просто сначала мне показалось это избыточным. Сейчас мне так уже не кажется.

Но возник другой вопрос.
Если в представленой структуре:
a - это серверная часть или некий код который вносит даные в sql
b - это клиентская часть или web морда которая показывает даные из sql.
То есть, при разных архитектурах может быть необходимость как в обоих пакетах на одной машине так и только в одном из них.
В этом случае можно распростраять два раздельных пакета.
Но исходя из того что это некий единный продукт можно cделать как то так:

 #!/usr/bin/env python
 #-*- coding: utf-8 -*-
 
 from setuptools import setup, find_packages
 from os.path import join, dirname
 
 ins = raw_input('Install a or b or all a/b/all')
 if ins == 'a':
     pkgs = ['pkg', 'pkg.a']
 elif ins  == 'b':
     pkgs = ['pkg', 'pkg.b']
 else:
     pkgs = find_packages()
 
 setup(
     name='pkg',
     version='1.0',
     packages= pkgs ,
     include_package_data=True,
 )

Или это ересь?
bw
Так не делается. Разделяйте на дистрибутивы типа: mypkg.common, mypkg.server, mypkg.client с `namespace_packages` “mypkg”. К тому же исходники всё равно все месте распространяться будут, яйца, да, можно собрать и так и эдак, но получится что яйцо с одинаковым именем проекта и версией по разному себя ведёт, в зависимости от сборки, шаблон может не выдержать. Так всё таки не делают.
Так же посмотрите `extras_require`, для клиента и сервера можно указать разные зависимости, а в ходе импорта (например) определять можно использовать здесь сервер (есть ли зависимости) или нет.

..bw
soln
Спасибо. За ваши ответы.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB