繁体   English   中英

Python3 包文件在不同目录下使用时无法从同一目录导入

[英]Python3 package file cannot import from same directory when used in a different directory

我的目录结构如下

├── 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的父目录,我想用barbarlib

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


编辑:如果有人想重现问题, 这是一个重新创建文件夹结构的脚本

为了能够在mypkg之外导入函数,您可以尝试这种方式:

第 1 步:编辑您的__init__.py

from .foolib import foo
from .barlib import bar

Step2:在main.py添加mypkgmain.py

import mypkg

第三步:现在,你可以像这样在main.py使用foobar

mypkg.foo()

mypkg.bar()

在本地制作类似的结构后,它对我来说适用于 Python2 和 Python3。 你能再检查一下吗?

我的文件结构如下:

  • pyprob
    • main.py
    • 我的包
      • __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()

- >运行main.py在Python2或Python3

  • python2 main.pypython3 main.py

- >运行的pmain.pymypkg包在Python2或Python3

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

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

-> 输出

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM