локальные модули Python - PullRequest
       5

локальные модули Python

6 голосов
/ 12 октября 2011

У меня есть несколько каталогов проектов, и я хочу иметь библиотеки / модули, специфичные для них. Например, у меня может быть такая структура каталогов:

myproject/
  mymodules/
    __init__.py
    myfunctions.py
  myreports/
    mycode.py

Предполагая, что в myfunctions.py есть функция с именем add, я могу вызвать ее из mycode.py с наиболее наивной процедурой:

execfile('../mymodules/myfunctions.py')
add(1,2)

Но чтобы быть более изощренным, я также могу сделать

import sys
sys.path.append('../mymodules')
import myfunctions

myfunctions.add(1,2)

Это самый идиоматический способ сделать это? Также есть упоминание об изменении PYTHONPATH (os.environ['PYTHONPATH']?), Но стоит ли мне заняться этим или другими вещами?

Кроме того, я видел import операторы, содержащиеся в операторах класса, и в других случаях, определенные в верхней части файла Python, который содержит определение класса. Есть ли правильный / предпочтительный способ сделать это?

1 Ответ

12 голосов
/ 12 октября 2011

Не связывайтесь с execfile или sys.path.append, если для этого нет веских причин. Скорее просто расположите ваш код в правильных пакетах Python и выполните импорт, как и в любой другой библиотеке.

Если ваш mymodules на самом деле является частью одного большого проекта, то настройте ваш пакет следующим образом:

myproject/
    __init__.py
    mymodules/
        __init__.py
        myfunctions.py
    myreports/
        __init__.py
        myreportscode.py

И затем вы можете импортировать mymodules из любого места в вашем коде, например так:

from myproject.mymodules import myfunctions
myfunctions.add(1, 2)

Если ваш код mymodules используется несколькими отдельными и разными проектами, просто соберите его в отдельный пакет и установите в любую среду, в которой он будет использоваться.

...