Есть ли способ добавить дистрибутив префикса пространства имен в дистрибутивы пакета? - PullRequest
2 голосов
/ 16 мая 2011

Я хочу добавить префикс пространства имен в мой распределенный пакет Python setuptools.Например, у нас есть пакет с именем common_utils, и мы хотели бы, чтобы к нему обращались как umbrella.common_utils без необходимости включать фиктивную директорию / модуль umbrella в дерево пакетов.

Возможно ли это?

Спасибо

1 Ответ

2 голосов
/ 16 мая 2011

Вы можете использовать опцию package_dir, чтобы сообщить setuptools полное имя пакета и расположение подпакета:

from setuptools import setup

setup(
    name = 'umbrella',
    packages = [
        'umbrella.common_utils'
        ],
    package_dir = {
        'umbrella.common_utils': './common_utils'
        }
    )

Результат:

% python setup.py build
..
creating build/lib/umbrella
creating build/lib/umbrella/common_utils
copying ./common_utils/__init__.py -> build/lib/umbrella/common_utils

Обновлено

Как вы обнаружили, цель python setup.py develop немного взломана. Он добавляет папку вашего проекта в site-packages/easy-install.pth, но ничего не делает для адаптации вашего пакета к структуре, описанной в setup.py. К сожалению, я не нашел для этого совместимого с setuptools / распространяемого решения.

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

Создайте файл с именем develop в корневом каталоге вашего проекта:

#!/usr/bin/env python

import os
from distutils import sysconfig

root = os.path.abspath(os.path.dirname(__file__))
pkg = os.path.join(sysconfig.get_python_lib(), 'umbrella')
if not os.path.exists(pkg):
    os.makedirs(pkg)
open(os.path.join(pkg, '__init__.py'), 'wb').write('\n')
for name in ('common_utils',):
    dst = os.path.join(pkg, name)
    if not os.path.exists(dst):
        os.symlink(os.path.join(root, name), dst)


(virt)% chmod 755 ./develop
(virt)% ./develop
(virt)% python -c 'from umbrella import common_utils; print common_utils'
<module 'umbrella.common_utils' from 
   '/home/pat/virt/lib/python2.6/site-packages/umbrella/common_utils/__init__.pyc'>
...