我正在构建一个包含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 :(得分: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.functionsFromfile1
和MyModule.MySubModule.functionsFromfile2
。