Как импортировать функции из других проектов в Python?
У меня есть код в проекте, который я бы хотел использовать в другом проекте. Что мне нужно сделать (в обеих папках), чтобы я мог это сделать?
Структура каталогов выглядит примерно так:
Я хочу использовать функции из файлов file1.py и file2.py в файлеX.py и fileY.py.
Ответы
Ответ 1
В идеале оба проекта будут устанавливаемым пакетом python, полным __init__.py и setup.py. Затем они могут быть установлены с помощью python setup.py install
или аналогичного.
Если это невозможно, не используйте execfile()
! Манипулируйте PYTHONPATH
, чтобы добавить Foo
, чтобы import Project1.file1
работал.
Например, из Project2/fileX.py:
from os import path
import sys
sys.path.append(path.abspath('../Foo'))
from Project1.file1 import something
Однако реальный ответ состоит в том, чтобы сделать каждый дискретный устанавливаемый пакет.
Ответ 2
Возможно, вы захотите сделать module, а затем импортировать из него все, что вам нужно.
Ответ 3
Здесь многое происходит. вы должны прочитать о пакетах python и управлении модулем http://docs.python.org/2/tutorial/modules.html#packages, но основная идея заключается в том, что fileX должен знать, где файлы file1 и file2 используются для использования их.
Чтобы превратить папку в пакет, она просто должна содержать файл __init__.py
. Я бы предложил вам сделать это (в терминале)
$ touch Foo/__init__.py
$ touch Foo/Project1/__init__.py
(предполагается, что вы используете unix/linux).
Затем каким-то образом fileX должен знать, где находится пакет Foo
. Вы можете вызвать sys.path.append(PATH)
, где PATH - это местоположение Foo.
Наконец, внутри fileX.py у вас будет
import sys
sys.path.append(PATH) #replace PATH with the path to Foo
from Foo.Project1 import file1
#use its functions
file1.function_name(argument)
если вы действительно хотите просто сказать function_name
без предшествующего file1.
, вы можете импортировать все свои функции, сказав from Foo.Project1.file1 import *
, однако обратите внимание, что from module import *
сильно нахмурился, поскольку он смешивает имена и делает код менее читабельным и понятным
Ответ 4
Я думаю, вы можете добавить Foo
к текущему пути Python с помощью os.path.join()
или os.path.append()
и сделать from import Project1.file1 import function_name
.
Ответ 5
Вы берете код, который хотите использовать в обоих проектах, и помещаете его в module, который вы извлекаете в третий отдельный проект. Этот проект вы делаете в пакет, который вы можете работать отдельно. Затем вы публикуете его версию и повторно используете в своих других проектах.
Важно, чтобы у вас были версии, которые вы "выпускаете", чтобы вы могли отслеживать, какую версию модуля использует каждый проект. В противном случае вы окажетесь в ситуации, когда старый проект перестает работать, потому что вы внесли несовместимые изменения в общий модуль.
Если он универсален для использования не только для вас, но и для других, рассмотрите возможность его загрузки в PyPI.