【问题标题】:Python3 package file cannot import from same directory when used in a different directoryPython3包文件在不同目录使用时无法从同一目录导入
【发布时间】:2021-02-02 05:45:24
【问题描述】:

我的目录结构如下

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

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

from foolib import foo

def bar():
  foo()

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

import barlib

barlib.bar()

现在在父目录的main.py,我想使用bar from 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 如果有人想重现问题,则重新创建文件夹结构

【问题讨论】:

  • 你的__init__.py里​​面有什么?
  • 没什么。它只是为了让mypkg 成为一个包
  • 成功了吗?让我知道,否则我将删除答案。

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


【解决方案1】:

为了能够在mypkg之外导入函数,可以试试这个方法:

第 1 步:编辑您的 __init__.py

from .foolib import foo
from .barlib import bar

Step2:在main.py中添加mypkg的导入

import mypkg

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

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中运行mypkg包中的pmain.py

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

这些命令是这样的,因为mypkg 是一个包。

-> 输出

  • We are in main.py
    We are in barlib
    Calling foo()
    We are in foo() now
    

【讨论】:

  • 这不起作用。还是barlib找不到foolib
  • 如果你还有兴趣,可以从this script创建我的文件夹结构并自己检查
  • 您尝试运行pmain.py 吗? File "mypkg/pmain.py", line 1, in &lt;module&gt; from .barlib import bar ModuleNotFoundError: No module named '__main__.barlib'; '__main__' is not a package 这正是我的问题。我无法创建文件,我可以同时运行 mainpmain
  • 添加您要运行的命令,我会尝试并尽快通知您。
  • python3 main.pypython3 mypkg/pmain.py
猜你喜欢
  • 1970-01-01
  • 2018-03-11
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
相关资源
最近更新 更多