我的目录结构如下
├── 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如果有人想重现问题,则重新创建文件夹结构
答案 0 :(得分:0)
要能够在mypkg
外部导入函数,可以尝试以下方式:
第1步:修改您的__init__.py
from .foolib import foo
from .barlib import bar
步骤2:在mypkg
中添加main.py
的导入
import mypkg
Step3:现在,您可以像这样在foo
中使用bar
和main.py
:
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()
->在Python2或Python3中运行main.py
python2 main.py
或python3 main.py
->在Python2或Python3中运行pmain.py
包中的mypkg
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