在其他目录中使用时,Python3软件包文件无法从同一目录导入

时间:2020-10-19 12:38:06

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

我的目录结构如下

├── main.py
└── mypkg
    ├── barlib.py
    ├── foolib.py
    ├── __init__.py
    └── pmain.py

我有两个要运行的文件。父目录中的main.py和我的软件包目录中的pmain.py。我在foo()中有一个简单的函数foolib.py。在barlib.py中,我从foo导入foolib

from foolib import foo

def bar():
  foo()

pmain.py中,我导入bar并使用它。 到目前为止,一切都很好。没有错误。

import barlib

barlib.bar()

现在在父目录的main.py中,我想使用bar中的barlib

from mypkg.barlib import bar

bar()

python 3 (经过3.6和3.8测试)中,这表明barlib找不到foolib(但是 python 2 给我没有错误)

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from mypkg.barlib import bar
  File "/xxxxx/mypkg/barlib.py", line 1, in <module>
    from foolib import foo
ModuleNotFoundError: No module named 'foolib'

我可以修改barlib中的import语句以使用模块名称进行导入,以使错误消失

from mypkg.foolib import foo

但是现在我无法运行我的其他文件pmain,该文件位于软件包目录中(显然)。它给了我

Traceback (most recent call last):
  File "mypkg/pmain.py", line 1, in <module>
    from barlib import bar
  File "/xxxxx/mypkg/barlib.py", line 1, in <module>
    from mypkg.foolib import foo
ModuleNotFoundError: No module named 'mypkg'

有人可以解释一下这里发生了什么吗?我在python3的这种行为上找不到另一个类似的问题

如何导入包目录内部,以便可以在父目录和包目录中使用bar


编辑:Here's a script如果有人想重现问题,则重新创建文件夹结构

1 个答案:

答案 0 :(得分:0)

要能够在mypkg外部导入函数,可以尝试以下方式:

第1步:修改您的__init__.py

from .foolib import foo
from .barlib import bar

步骤2:在mypkg中添加main.py的导入

import mypkg

Step3:现在,您可以像这样在foo中使用barmain.py

mypkg.foo()

mypkg.bar()

在本地创建类似的结构后,它对我来说对Python2和Python3都适用。您可以再次检查吗?

我的文件结构如下:

  • pyprob
    • main.py
    • mypkg
      • __init__.py
      • barlib.py
      • foolib.py
      • pmain.py

文件内容为:

  • __init__.py

    from .barlib import *
    from .foolib import *
    
  • barlib.py

    from .foolib import foo
    
    print("We are in barlib")
    
    def bar():
       print("Calling foo()")
       foo()
    
  • foolib.py

    def foo():
      print("We are in foo() now")
    
  • pmain.py

    from .barlib import bar
    
    print("We are in pmain")
    bar()
    
  • main.py

    print("We are in main.py")
    
    import mypkg
    
    mypkg.bar()
    

->在Python2或Python3中运行main.py

  • python2 main.pypython3 main.py

->在Python2或Python3中运行pmain.py包中的mypkg

  • python2 -m mypkg.pmainpython3 -m mypkg.pmain

命令之所以类似,是因为mypkg是一个软件包。

->输出

  • We are in main.py
    We are in barlib
    Calling foo()
    We are in foo() now
    
相关问题