2016-11-28 54 views
0

我正在用2個源python文件構建一個相對簡單的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。但是,如果我不是裏面的init類型的

from .file2 import * 
from .file1 import * 

和文件1型內

import MyModule 

然後我可以使用內部文件2定義的內部文件1的功能,像這樣

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 

裏面MyModule中的__init__.py我導入文件1爲from .file1 import *和內在MySubModule裏面的__init__.py我導入file2爲from .file2 import *

裏面的file1的我然後使用MySubModule像這樣:

import MyModule.MySubModule 

MyModule.MySubModule.FunctionFromfile2(...) 

這具有當以模塊的進口分離的file1和file2的功能/對象的名稱空間的好處。用戶看到MyModule.functionsFromfile1MyModule.MySubModule.functionsFromfile2