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

在python中将另一个项目作为模块导入,python,python-3.x,python-import,Python,Python 3.x,Python Import,假设我有一个如下结构的项目 projectfoo/ |- mymodule/ |--|- __init__.py |--|- library.py |- preprocessor.py 在mymodule中的\uuuu init\uuuu.py如下所示 from . import library #library itself has other functions def some_function(): blar blar blar... 而预处理器.py如下所示 import

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

projectfoo/
|- mymodule/
|--|- __init__.py
|--|- library.py
|- preprocessor.py
mymodule
中的
\uuuu init\uuuu.py
如下所示

from . import library #library itself has other functions

def some_function():
    blar blar blar...
预处理器.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
因此,我尝试在我的
index.py
中导入
预处理器,如下所示

from projectfoo import preprocessor
但是,我收到一个错误消息说,
preprocessor.py
现在无法导入
mymodule

ImportError: No module named 'mymodule'
我这样做对吗?在我的设置中,我使用运行在ubuntu 14.04中的python3.4


编辑:我也尝试过将
\uuuu init\uuuuuuuuuuupy
添加到
projectfoo
,但是我仍然得到相同的错误尝试将空的
\uuuuuuuuuuuuuuuuuuuuuuuupy
添加到
projectfoo
文件夹。

你必须添加一个
文件(可以为空)以使其成为有效的模块

然后使用相对导入明确指定您正在请求当前模块的子模块
mymodule
,如下所示:

from .projectfoo import preprocessor

代表包含导入语句的文件所在的当前模块。其父模块将表示为
,其“祖辈”将是
等。

您必须添加一个
\uuuu init\uuuuuuuuuy
文件(可以为空)在
projectfoo/
文件夹中,使其成为有效的模块

然后使用相对导入明确指定您正在请求当前模块的子模块
mymodule
,如下所示:

from .projectfoo import preprocessor

代表包含导入语句的文件所在的当前模块。其父模块将表示为
,其“祖辈”将表示为
等。

您收到此错误,因为您没有将预处理器的路径作为库包添加

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将在系统设置中返回path env.变量


希望有帮助。

您遇到此错误,因为您没有将预处理器的路径添加为库包

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将在系统设置中返回path env.变量



希望能有帮助。

argh,我忘了说,我试过使用和不使用
\uuuu init\uuuuuy.py
,都不起作用,同样problem@Jeffrey04保持
\uuuu init\uuuuu.py
到位,并将导入行更改为相对导入:
from.projectfoo导入预处理器
(注意代表当前模块的
projectfoo
前面的点)这是否起作用?
SystemError:未加载父模块“”,无法执行相对导入
LOL@Jeffrey04然后,我猜您可能必须在
项目栏
目录中添加另一个
\uuuu init\uuuu.py
(:检查已接受答案的解决方案lolargh,我忘了说,我尝试了使用和不使用
\uuuu init\uuuuuuy.py
,都不起作用,相同problem@Jeffrey04保持
\uuuu init\uuuuu.py
到位,并将导入行更改为相对导入:
from.projectfoo导入预处理器
(注意代表当前模块的
projectfoo
前面的点)这是否起作用?
SystemError:未加载父模块“”,无法执行相对导入
LOL@Jeffrey04然后,我猜您可能必须在
项目栏
目录中添加另一个
\uuuu init\uuuu.py
(:检查已接受的答案以获得解决方案lolargh,我忘了说,我尝试过使用和不使用init.py,都不起作用,同样的问题Argh,我忘了说,我尝试过使用和不使用init.py,都不起作用,同样的问题它起作用,但是当我需要从
导入任何内容时,是否可以不必导入
sys
os
projectfoo
?我的意思是,我可以让所有脚本在
projectbar
中自动执行这些行吗?据我所知,这是最好的方法。如果可以指定绝对路径,例如“d:\files\python\projectfoo”,则可以跳过导入操作系统。我不是说这不可能,但据我所知,这是最好的方法我怎样才能做到这一点。:)呃,我实际上想问我是否可以在某个地方自动运行os和sys导入,这样我就不必在
projectbar
中的多个脚本中复制和粘贴相同的行。根据我的感觉,您不会手动运行所有脚本,您只有一个主脚本将由您执行(这是一个猜测,因为我是这样做的。)你可以在一个脚本中添加这两行。:@Jeffrey04我希望你能得到一个好友:)。快乐编码:)这是可行的,但是当我需要从
projectfoo
导入任何内容时,是否可以不必导入
sys
os
?我的意思是,我可以让
projectbar
中的所有脚本自动执行这些行?据我所知,这是最好的方法。如果可以指定b绝对路径,例如“d:\files\python\projectfoo”。我并不是说这是不可能的,但据我所知,这是最好的方法呃,我实际上想问我是否可以在某个地方自动运行os和sys导入,这样我就不必在
projectbar
中的多个脚本中复制和粘贴相同的行。根据我的感觉,您不会手动运行所有脚本,您只有一个主脚本将由您执行(这是一个猜测,因为我是这样做的。)你可以在一个脚本中添加这两行。:@Jeffrey04 i