Как я могу использовать общий код в Python? - PullRequest
18 голосов
/ 25 июня 2010

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

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

Если мой вопрос не ясен, пожалуйста, дайте мне знать.

Ответы [ 3 ]

18 голосов
/ 25 июня 2010

Ничего особенного вам не нужно делать, Python просто нужно найти ваш модуль.Это означает, что вы должны поместить свой общий модуль в PYTHONPATH или добавить его местоположение в sys.path. См. Это.

Скажем, у вас есть

~/python/project1
~/python/project2
~/python/libs/stuff.py
~/python/libs/other.py

Вы можете либо установить PYTHONPATH='~/python/libs' в своей среде os, либо вы можете сделать

import sys, os
sys.path.append(os.path.expanduser('~/python/libs')) # or give the full path

После этого вы можете сделать import stuff, other в любом месте.

Вы также можете упаковать свои вещи, тогда вам нужен макет, подобный следующему:

~/python/project1
~/python/project2
~/python/libs/mylibname/__init__.py
~/python/libs/mylibname/stuff.py
~/python/libs/mylibname/other.py

~/python/libs/mylibname/__init__.py должен существовать, номожет быть пустой файл.Он превращает mylibname в пакет .

После добавления папки libs в ваш путь, как указано выше, вы можете сделать from mylibname import stuff, other.

3 голосов
/ 25 июня 2010

Существует множество способов разложить код, чтобы его можно было многократно использовать.Это действительно зависит от вашей конкретной ситуации, насколько то, что будет работать лучше всего.Разделение вашего кода на отдельные пакеты и модули - это всегда хорошая идея, поэтому связанный код остается связанным и может быть повторно использован из других пакетов и модулей.Факторизация вашего кода в классах внутри модуля также может помочь сохранить сгруппированный код вместе.

Я бы сказал, что размещение общего кода в модуле или пакете, который находится на вашей PYTHONPATH и доступен для обоих приложений, вероятно, будет вашимлучшее решение.

0 голосов
/ 25 июня 2010

Вот как бы я это сделал:

  • создайте EGG-архив вашего общего проекта:

    ~:zip common.egg common
    
  • сделать файл egg частью вашей библиотеки

    cp common.egg PROJECT_PATH/lib/
    
  • в ваших проектах:

    import glob
    import os
    
    def main():
        path_lib=os.path.abspath(os.path.split(os.path.abspath(sys.modules['__main__'].__file__))[0] + '/../lib')
        sys.path += glob.glob(path_lib + '/*.egg')
        from common import stuff
        stuff.doCommonStuff()
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...