Подтвердить что ты не робот

Как я могу использовать общий код в python?

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

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

Если мой вопрос не ясен, сообщите мне.

4b9b3361

Ответ 1

Нет ничего особенного, что вам нужно сделать, 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 в package.

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

Ответ 2

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

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

Ответ 3

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

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

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

    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()