2016-11-28 4 views
0

Я создаю относительно простой модуль python с 2 исходными файлами python.Как импортировать другой файл python в модуль

Структура следующим образом:

├── MyModule 
│   ├── MyModule 
│   │   ├── __init__.py 
│   │   ├── file1.py 
│   │   ├── file2.py 
│   ├── requirements.txt 
│   ├── setup.py 

внутри __init__.py У меня

from .file1 import * 

таким образом, что при ввозе можно просто ввести mymodule.myFunction()

и внутри file1.py меня

import file2 

Затем я использую pip install -e . для установки модуля.

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

----> 1 import file2 
     2 import matplotlib.pyplot as plt 
     3 import numpy as np 
     4 import scipy.signal 

ImportError: No module named 'file2' 

Что является общепринятым способом я должен идти об этом?

+0

Вы должны быть «импортировать MyModule» и убедиться, что путь к MyModule внутри PYTHONPATH или sys.path – Skycc

ответ

0

Похоже, проблема заключалась в том, что когда файл импортируется в файл init .py, он видит текущую среду python, в которой он импортируется, и поэтому не может видеть файл file2.py. Однако, если я вместо того, чтобы внутри типа инициализации

from .file2 import * 
from .file1 import * 

и внутри типа file1

import MyModule 

, то я могу использовать функции, определенные внутри file2 внутри file1 как так

MyModule.FunctionFromfile2(...) 

Другой способ сделать это будет инициализировать подпакет, как описано здесь https://docs.python.org/2/distutils/examples.html.

Я закончил с использованием его в качестве подпакета, как это было более разумным для моего конкретного случая структура каталогов теперь так:

├── MyModule 
│ ├── MyModule 
│ │ ├── __init__.py 
│ │ ├── file1.py 
│ │ ├──MySubModule 
│ │ │ ├── __init__.py 
│ │  ├── file2.py 
│ ├── requirements.txt 
│ ├── setup.py 

Внутри __init__.py в MyModule импортировать file1 в from .file1 import * и внутри __init__.py внутри MySubModule я импортирую файл2 как from .file2 import *.

Внутри файла1 я затем использовать MySubModule следующим образом:

import MyModule.MySubModule 

MyModule.MySubModule.FunctionFromfile2(...) 

Это имеет преимущество разделения пространств имен функций/объектов из file1 и file2 при ввозе в качестве модуля. Как пользователь видит MyModule.functionsFromfile1 и MyModule.MySubModule.functionsFromfile2.

 Смежные вопросы

  • Нет связанных вопросов^_^