Как импортировать функции из других проектов в Python?

У меня есть код в проекте, который я бы хотел использовать в другом проекте. Что мне нужно сделать (в обеих папках), чтобы я мог это сделать?

Структура каталогов выглядит примерно так:

  • Foo
    • Project1
      • file1.py
      • file2.py
  • Бар
    • Проект2
      • fileX.py
      • fileY.py

Я хочу использовать функции из файлов 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.