假设我有一个以下结构的项目
projectfoo/
|- mymodule/
|--|- __init__.py
|--|- library.py
|- preprocessor.py
并且__init__.py
中的mymodule
看起来像这样
from . import library #library itself has other functions
def some_function():
blar blar blar...
并且preprocessor.py
看起来如下
import mymodule
def main():
something()
def something():
mymodule.some_function() # calls the function defined in __init__.py
if __name__ == '__main__':
main()
然后我开始projectbar
,它正在使用projectfoo
中的许多常用代码。因此,我不想在项目之间复制和粘贴代码,而是将projectfoo
导入到项目栏中,如下所示。
projectbar/
|- projectfoo/
|--|- mymodule/
|--|--|- __init__.py
|--|--|- library.py
|--|- preprocessor.py
|- index.py
所以我尝试在preprocessor
中导入index.py
,如下所示
from projectfoo import preprocessor
但是我收到错误消息称preprocessor.py
现在无法导入mymodule
。
ImportError: No module named 'mymodule'
我这样做是否正确?我在我的设置中使用在ubuntu 14.04中运行的python3.4。
编辑:我也尝试将__init__.py
添加到projectfoo
,但我仍然遇到同样的错误
答案 0 :(得分:3)
您收到此错误是因为您没有将预处理程序的路径添加为库包
from sys import path as pylib #im naming it as pylib so that we won't get confused between os.path and sys.path
import os
pylib += [os.path.abspath(r'/projectfoo')]
from projectfoo import preprocessor
仅供参考:os.path将返回绝对路径。但sys.path将返回路径env。系统设置中的变量。
希望它有所帮助。
答案 1 :(得分:2)
尝试将空__init__.py
添加到projectfoo
文件夹。
答案 2 :(得分:1)
您必须在__init__.py
文件夹中添加projectfoo/
文件(可以为空),使其成为有效模块。
然后使用相对导入明确指定您请求当前模块的子模块mymodule
,如下所示:
from .projectfoo import preprocessor
.
代表包含import语句的文件所在的当前模块。它的父模块将表示为..
,它的父母是"祖父母"将是...
等。