【问题标题】:Importing another project as modules in python在 python 中将另一个项目作为模块导入
【发布时间】:2016-05-03 05:38:00
【问题描述】:

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

projectfoo/
|- mymodule/
|--|- __init__.py
|--|- library.py
|- preprocessor.py

__init__.pymymodule 看起来像这样

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

所以我试图在我的index.py 中导入preprocessor,如下所示

from projectfoo import preprocessor

但是我收到一条错误消息,提示 preprocessor.py 现在无法导入 mymodule

ImportError: No module named 'mymodule'

我这样做正确吗?我在我的设置中使用在 ubuntu 14.04 中运行的 python3.4。

编辑:我也尝试将__init__.py 添加到projectfoo,但我仍然遇到同样的错误

【问题讨论】:

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


【解决方案1】:

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

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 将返回路径环境。系统设置中的变量。

希望对你有帮助。

【讨论】:

  • 它可以工作,但是当我需要从projectfoo 导入任何东西时,是否可以不必导入sysos?我的意思是我可以自动为projectbar 中的所有脚本执行这些行吗?
  • 据我所知,这是最好的方法。如果您可以指定绝对路径,则可以跳过导入操作系统,例如 'd:\files\python\projectfoo' 。我并不是说这是不可能的,但据我所知,这是我能做到的最好方法。 :)
  • erm,其实我是想问问能不能在某处自动运行 os 和 sys 导入,这样就不用在projectbar的多个脚本中复制粘贴相同的行了跨度>
  • 根据我的感觉,您不会手动运行所有脚本,您将只有一个主脚本将由您执行(这是一个猜测,因为我是如何做到的.) 您可以在该脚本中添加这两行。 :)
  • @Jeffrey04 我希望你能得到一个好友 :) 。快乐编码:)
【解决方案2】:

尝试将空的__init__.py 添加到projectfoo 文件夹。

【讨论】:

  • 啊,我忘了说,我尝试了使用和不使用 init.py,都行不通,同样的问题
【解决方案3】:

您必须在您的projectfoo/ 文件夹中添加一个__init__.py 文件(可以为空)以使其成为有效模块。

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

from .projectfoo import preprocessor

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

【讨论】:

  • 啊,我忘了说,我试过有没有__init__.py,都行不通,同样的问题
  • @Jeffrey04 保留__init__.py 并将您的导入行更改为相对导入:from .projectfoo import preprocessor(注意projectfoo 之前的点代表当前模块)这可行吗?
  • SystemError: Parent module '' not loaded, cannot perform relative import LOL
  • @Jeffrey04 那么我猜你可能必须在projectbar 目录中添加另一个__init__.py
  • 试过了,还是一样的错误(:检查解决方案的接受答案lol
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 2014-01-12
相关资源
最近更新 更多