从调用其他模块的python文件导入模块

时间:2019-07-09 18:20:46

标签: python python-3.x module importerror

我正在尝试运行特定的代码,现在需要以下Python文件的导入,并且出现错误,我构造了一个玩具示例来说明问题。我在Python版本3.6.3上运行。
请考虑以下文件夹结构。

root
  |- outside.py
  |- folA
       |- __init__.py
       |- inside.py
       |- folB
            |- __init__.py
            |- eveninside.py

现在这些文件的内容如下。

outside.py

import folA.inside
print("Outside")


inside.py

import folB.eveninside
print("Inside")


eveninside.py

print("Even Inside")   #All inits are empty


现在,当我运行 inside.py 时,一切运行得很好,并具有预期的输出。 但是,当我在outside.py上运行时,出现错误消息“没有名为folB的模块”。我尝试附加系统路径,但没有任何更改。请向我解释如何解决此问题。

2 个答案:

答案 0 :(得分:-1)

这只是来自python从python路径查找模块这一事实。在这里,当您在外部启动时,他会尝试查看您的目录中outside.py中是否存在folB。

两种解决方案。

  1. 您可以在inside.py中使用ggplot(data,aes(x=value)) + geom_histogram() + scale_x_continuous(trans='log2') 来添加目录folA作为尝试导入模块时要查找的位置。我不知道这是一种很好的做法。

  2. 在您的情况下,您可以只在inside.py`import folA.folB.eveninside中编写。但是显然,当您启动inside.py时,它将无法工作。在这种情况下,您有第一个解决方案。

答案 1 :(得分:-1)

如果只希望从outside.py运行该程序,则可以将此代码添加到outside.py中的include中:

import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '.')))

并使用以下代码将context.py添加到包结构的每个级别:

import os
import sys
path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
sys.path.insert(0, path)

_ = ''

然后您可以将其导入代码中,以使其了解程序包的结构。 即inside.py将有 from .context import _

免责声明:此代码来自其他人,但我不确定是谁。可能this article。我敢肯定,存在更好的做法,但是我发现它可以工作,并且context.py是将常量保持在中心位置的好地方。只需导入它们而不是下划线