2015-08-22 4 views
0

Относительно новый для python, и я использую его для автоматизации лабораторного оборудования на работе.Импорт модулей из нескольких параллельных подкаталогов (Python)

У меня есть сценарий, живущий в каталоге B. Родитель каталога B - это каталог A. Каталог A содержит еще один каталог, в который мне нужно ввести и импортировать модули. Структура выглядит так:

  A 
    B     C 
    myscript.py  
        E  F 
        m1.py m2.py 

Мне нужно импортировать m1.py и m2.py в свой скрипт. Я не могу переместить мой скрипт выше в каталог A, потому что он обращается к кучке других модулей, которые я написал и сбрасывал в B. Мне нужно поддерживать структуру каталогов всего, включая и под каталогом C по причинам, характерным для компании (не получается я начал.)

Мой вопрос в том, как я могу разумно импортировать эти данные? Я не хочу жестко кодировать их пути, поскольку они будут жить в SVN, и корень может измениться. Я думаю об использовании цикла для сканирования? Я просто не знаком с синтаксисом, чтобы сделать это возможным. Все решения приветствуются!

ответ

3

У меня есть следующий файл установки:

A 
    ├── B 
    │   ├── __init__.py 
    │   └── myscript.py 
    └── C 
       ├── E 
       │   ├── __init__.py 
       │   └── m1.py 
       ├── F 
       │   ├── __init__.py 
       │   └── m2.py 
       └── __init__.py 

Код:

A/C/E/m1.py

def my_func1(): 
    print 'func1' 

A /C/F/m2.py

def my_func2(): 
    print 'func2' 

A/B/myscript.py

from C.E.m1 import my_func1 
from C.F.m2 import my_func2 

my_func1() 
my_func2() 

Или, если имя каталога импорта имеет место (например, C dir, а не C):

import importlib 
m1 = importlib.import_module("C dir.E.m1") 
m2 = importlib.import_module("C dir.F.m2") 

m1.my_func1() 
m2.my_func2() 

Все __init__.py файлы пустые, но они должны существовать, поэтому Python знает, как искать в этих папках код.

, а затем запустить скрипт в виде пакета. Примечание: нет .py и конца имени файла.

$ python -m B.myscript 

Выход:

func1 
func2 
+0

Это хорошо работало, но какой синтаксис мне нужно использовать, если имя каталога «C реж» (или какой-либо другой множественный каталог слова), а не только один блока, как «С»? – jonnyd42

+0

См. Выше правки –

0

Лучше использовать импорт явно в Python и помнить о структуре каталогов. Если структура изменится, ваш импорт должен измениться.

Пока ваш проект находится на пути питона, вы должны быть в состоянии сделать это из модуля, который находится в B или в другом месте в иерархии:

from Project.A.B import myscript 
from Project.A.C.E import m1 
from Project.A.C.F import m2 
1

Если структура каталога всегда будет то же самое, вы можете попробовать импортировать m1.py и m2.py, добавив путь C в sys.path в ваш myscript.py.

Вы можете также относительно получить путь C из B с помощью os.path методов, как os.path.dirname и os.path.join и os.path.abspath и переменной - __file__.

Пример -

import os.path 
import sys 
curdir = os.path.dirname(__file__) 
cdir = os.path.abspath(os.path.join(curdir,'../C')) 
sys.path.append(cdir) 
import m1,m2 
Смежные вопросы