модуль Python из исходного кода - наименование - PullRequest
1 голос
/ 25 февраля 2011

Я - питон , занимающийся созданием модулей новичок.Следуя духу этого вопроса , я установил Rx для проверки некоторых данных из файлов YAML.Желая сохранить всю партию вместе, я просто поместил все дерево мерзавца под site-packages.Это дало мне (очень упрощенное) дерево для реализации Python site-packages/Rx/python/Rx.py.

Поскольку это не может быть импортировано напрямую, я добавил __init__.py к site-packages/Rx, одной строкой:

from Rx.python.Rx import *

Поскольку он все еще не может быть импортирован напрямую, я добавил __init__.py к site-packages/Rx/python одной строкой:

from Rx import *

Теперь я могу успешно импортировать.Это замечательно, но меня не волнует следующее

>>> import Rx
>>> a = Rx.Factory()
>>> a
<Rx.python.Rx.Factory object at 0x00C0CCF0>

Мне бы просто хотелось, чтобы объекты ссылались на имя пакета Rx, например, <Rx.Factory object at 0x00C0CCF0>.

* 1029.* Как это правильно сделать?Спасибо!

РЕДАКТИРОВАТЬ , для тех, кто может столкнуться с той же проблемой:

Я опустошил site-packages/Rx/python/__init__.py и изменил site-packages/Rx/__init__.py следующим образом:

import os
__path__.append( os.path.join(__path__[0], 'python') )
from Rx import *

Это не совсем то, что я хотел, но, по крайней мере, теперь объекты Rx.Rx.Factory и т. Д.

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Обычным примером является настройка вашего проекта следующим образом:

ProjectName/
|-- bin/
|   `-- myscript
|-- package_name/
|   |-- __init__.py
|   |-- rx.py
`-- setup.py

Ваш скрипт установки выглядит следующим образом:

#!/usr/bin/env python

from distutils.core import setup

setup(name='ProjectName',
      version='1.0',
      description='My project description',
      author='Me',
      author_email='Me@localhost',
      url='http://localhost/',
      packages=['package_name'],
     )

Когда вы запускаете:

$ python setup.py install 

Distutils скопирует каталог вашего пакета в site-packages.

С такой структурой ваш импорт будет выглядеть следующим образом:

from package_name import Rx
print Rx.Factory

То, что вы хотите, звучит так:

import package_name
print package_name.Factory

Для этого вам нужнодобавьте следующее в ваш init .py:

from rx import Factory

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

Самый простой способ сделать это - просто изменить каталог на каталог вашего проекта (cd ProjectName на основе приведенного выше примера), а затем просто выполнить ваш скрипт оттуда.

Если вам это не нравится, вы можете добавить свой пакет разработки в PYTHONPATH, выполнив что-то вроде:

$ export PYTHONPATH=$PYTHONPATH:/home/me/ProjectName

Еще один способ сделать это - использовать файл * .pth для добавления пакета разработки.на сайт-пакеты, и они все еще живут в вашем домашнем каталоге.Для этого вы просто создадите простой файл с именем что-то вроде myproject.pth, который будет включать:

# pth file for Rx development
/home/me/ProjectName

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

Конечно, есть другие опции, такие как манипулирование sys.path в ваших пользовательских файлах запуска, такие инструменты, как virtualenv, buildout и т. д.

0 голосов
/ 25 февраля 2011

Если в каталогах Rx / python верхнего уровня нет кода, вы можете просто удалить их и поместить файл Rx.py в пакеты site-*.Символическая ссылка Rx-файла откуда-то в site-package, но было бы лучше изменить вашу переменную PYTHONPATH, чтобы она включала каталог, содержащий Rx.py.всесторонним.Обязательно ознакомьтесь с разделом Путь поиска модуля .

...