Как я могу использовать общий код в python?
В настоящее время я поддерживаю два моих собственных приложения. Они оба разделяют некоторые общие аспекты, и, как результат, используют некоторый код. До сих пор я только что скопировал модули из одного проекта в другой, но теперь он становится проблемой обслуживания. Я бы предпочел иметь общий код в одном месте, за исключением обоих проектов, которые они могут импортировать. Затем любые изменения в общем коде будут отражены в обоих проектах.
Мой вопрос: как я могу это сделать? Создать библиотеку из этого кода? Если да, то каким образом зависимые проекты используют библиотеку? Я думаю, что одна вещь, с которой я сталкиваюсь, заключается в том, что общий код не очень полезен никому другому, или, по крайней мере, я не хочу, чтобы он поддерживал модули, которые могут использовать другие люди.
Если мой вопрос не ясен, сообщите мне.
Ответы
Ответ 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()