我的问题可以总结如下:
我有以下文件结构:
<path>/
- a.py
<path>/subdir/
- b.py
- c.py
关系是a导入b并且b导入c(a->b->c)。
更确切地说,每个文件的内容如下:
- c.py
def foo():
print("Hello World!")
- b.py
import c
def fie():
c.foo()
print("Second Hello World!")
if __name__=="__main__":
fie()
- a.py
from subdir import b
b.fie()
我希望的是,当调用a.py时,它将打印出以下字符串:
$ python3 a.py
Hello World!
Second Hello World!
$
并且从 /subdir 调用 b.py 将打印相同的内容:
$ cd subdir
$ python3 b.py
Hello World!
Second Hello World!
$
如果我从<path>
调用a.py,会得到以下结果:
$ python3 a.py
Traceback (most recent call last):
File "a.py", line 1, in <module>
from subdir import b
File "<path>/subdir/b.py", line 1, in <module>
import c
ModuleNotFoundError: No module named 'c'
$
如果我从
<path>/subdir
调用b.py,就会得到预期的行为:$ cd subdir
$ python3 b.py
Hello World!
Second Hello World!
$
如果我按照以下方式更改b.py:
- b.py
from subdir import c
def fie():
c.foo()
print("Second Hello World!")
if __name__=="__main__":
fie()
调用a.py的工作按预期进行,但这一次调用b.py却出现了ModuleNotFoundError
错误:
$ cd subdir
$ python3 b.py
Traceback (most recent call last):
File "b.py", line 1, in <module>
from subdir import c
ModuleNotFoundError: No module named 'subdir'
$
很奇怪,即使是在 <path>
的调用中,也会出现相同的错误:
$ python3 subdir/b.py
Traceback (most recent call last):
File "b.py", line 1, in <module>
from subdir import c
ModuleNotFoundError: No module named 'subdir'
$
如果我要替换 b.py 文件中的以下字符串:
from subdir import c
在
from . import c
我的最新测试结果完全相同。
在实际情况下,b和c都是位于子目录中的库的一部分,该库既可以直接使用(通过if __name__
技巧),也可以从任何其他地方导入以使用其函数。该库目前不能安装在文件系统的固定位置上(或者至少我不应该依赖它)。
在使用Python 2.6时,我从未遇到过这样的问题,而现在我正在迁移到Python 3.x。阅读Python 3.x导入指南很有帮助,但我没有找到任何有用的信息来解决这个基本的问题(这就是为什么我认为我在那里忽略了一些微不足道的东西)。
您能建议一种改变 [a,b,c] 中任何一个 .py 文件以满足这种情况的方法吗?
b.py
的顶部放置from subdir import c
并运行b.py
时,它可以正常工作,我没有收到ModuleNotFoundError
的错误提示。我是在运行Python 3.7 Windows 10。我不确定出了什么问题... - probata.py
中打印sys.path
并没有显示到sub
目录的路径。当然只会显示a.py
的路径。 - probat