在python中将另一个项目导入为模块

时间:2016-05-03 05:38:01

标签: python python-3.x python-import

假设我有一个以下结构的项目

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,但我仍然遇到同样的错误

3 个答案:

答案 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语句的文件所在的当前模块。它的父模块将表示为..,它的父母是"祖父母"将是...等。