[英]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
的父目录,我想用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
?
为了能够在mypkg
之外导入函数,您可以尝试这种方式:
第 1 步:编辑您的__init__.py
from .foolib import foo
from .barlib import bar
Step2:在main.py
添加mypkg
的main.py
import mypkg
第三步:现在,你可以像这样在main.py
使用foo
和bar
:
mypkg.foo()
mypkg.bar()
在本地制作类似的结构后,它对我来说适用于 Python2 和 Python3。 你能再检查一下吗?
我的文件结构如下:
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.py
或python3 main.py
- >运行的pmain.py
在mypkg
包在Python2或Python3
python2 -m mypkg.pmain
或python3 -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.