Python:从同一包中导入子模块或子包

7

我仍在尝试着如何创建软件包,这里有一个文件结构演示我的问题:

/main_package/
    __init__.py
    script1.py
    sub_package/
         __init__.py
         model.py

main_package__init__.py 中,假设我有以下内容:
import main_package.script1
...

script1.py 中,我有以下代码:

from sub_package import model
...

这不起作用。当我尝试导入main_package时,我在以下调用集中收到错误:import main_package.script1 -> from sub_package import model

显然,在script1.py中的from sub_package import model不起作用。

我尝试了以下方法:

from main_package.sub_package import model

from . import sub_package.model

from .sub_package import model

但是它们都没有起作用。如果我犯了愚蠢的错误,请原谅我,但是如何解决我的问题?


更新:好的,有些人确切地问了这是如何发生的,所以我将发布实际的错误消息和我的实际结构和过程。对不起,名称现在已从上面更改。

这是导致错误的包的真实结构:

script.py
/MCMC2/
    __init__.py
    main_script.py
    ExoData.py
    Models/
         __init__.py
         model_main.py

我在终端中运行 script.py (即 ipython script.py [args]) ,并且得到以下的错误消息(为了更加清晰,我抹去了问题后面的所有内容,并用 ... 代替)。

ImportError                               Traceback (most recent call last)
/home/usr/script.py in <module>()
      1 import pymc
----> 2 from MCMC2 import ExoData
      ...

/home/usr/MCMC2/__init__.py in <module>()
      ...
----> 4 import MCMC2.main_script
      ...

/home/usr/MCMC2/main_script.py in <module>()
      1 try: from Models import model_main
----> 2 except: from .Models import model_main
      ...

/home/usr/MCMC2/Models/__init__.py in <module>()
----> 1 import Models.model_main
      ...

ImportError: No module named 'Models'

顺便说一下,模型确实存在。


1
from .sub_package import model 给出了什么错误? - vaultah
1
你没有提到 script1.py 是如何被执行的。它是从其他程序中导入的还是直接作为脚本运行的? - tdelaney
1
通过在 main_package/__init__.py 中使用 from . import script1,以及在 main_package/script1.py 中使用 from .sub_package import model,我成功地运行了代码。请问您使用的是哪个版本的 Python?在运行测试时,您当前所在的目录是什么?我当时在 main_package 的上级目录中运行的测试,因此包能够被正确地找到。 - tdelaney
1
原始版本在Python上对我有效,就像您编写的那样。您从哪里导入,请发布确切的错误信息。 - kabanus
2
@LimokPalantaemon,你的第一个描述与第二个不符。你在Models.__init__中导入了Models.model_main,这是行不通的。 - Stop harming Monica
显示剩余3条评论
1个回答

0

好的,看起来我对整个包结构感到困惑了。参考更新中的结构 - 在 Models 的 __init__.py 文件中,我进行了如下导入:import Models.model_main 等等... 为了使其工作,我还需要添加 from . import model_main。顺便说一句,感谢您的帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接