我应该如何在模块中导入另一个python文件

时间:2016-11-28 10:32:12

标签: python module package pip pep8

我正在构建一个包含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'

我应该接受的方式是什么?

1 个答案:

答案 0 :(得分:0)

似乎问题是当文件导入 init .py文件时,它会看到当前正在导入它的python环境,因此无法看到file2.py。但是,如果我改为在init类型

from .file2 import *
from .file1 import *

并在file1中输入

import MyModule

然后我可以使用file1里面的file2中定义的函数,如此

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的内部,我将file1导入为from .file1 import *,并在MySubModule内的__init__.py内导入file2为from .file2 import *

在file1内部,然后像我这样使用MySubModule:

import MyModule.MySubModule

MyModule.MySubModule.FunctionFromfile2(...)

这有利于在作为模块导入时将函数/对象的名称空间与file1和file2分开。用户看到MyModule.functionsFromfile1MyModule.MySubModule.functionsFromfile2