TL;DR 如何使导入可解析,无论文件是直接运行还是由父模块导入?
这与从父包导入模块的数百万个问题不同。我很难找到完全相同的问题,所以如果我错过了什么,请为我指出正确的方向。另一方面,也许这意味着我想做的事情没有意义。
我有一个基于
pkg
的 VSCode 项目:
pkg\
main.py
__init__.py
subpkg\
foo.py
bar.py
__init__.py
假设
foo.py
包含这样的内容:
from bar import baz
def something_intended_to_be_called_from_main():
baz()
def quick_and_dirty_tests_while_programming():
pass
if __name__ == '__main__':
quick_and_dirty_tests_while_programming()
假设
main.py
只包含 import foo
。
问题来了。如果我直接运行
foo.py
,导入就解决了。但如果我运行 main.py
,则导入不会解析,因为 bar
不在 pkg
中。我可以通过将 foo.py
中的导入行更改为 from subpkg.bar import baz
来解决此问题,但直接运行时不会解决该问题。
有办法做我想做的事吗?我的意思是,我想我可以放入一个具有两种分辨率的
try ... except
块,但这看起来很黑客(甚至比在子模块中包含快速和肮脏的测试还要多)。
首先,如果
main.py
只包含代码import foo
,我认为它应该提高ModuleNotFoundError: No module named 'foo'
,除非main.py
中的condes是import subpkg.foo
,那么它会提高ModuleNotFoundError: No module named 'bar'
当您在
pkg
目录下运行 main.py 时,Python 会将当前路径 ../pkg
视为根路径,以在其下查找要导入的包。要更改此根路径并满足您的需要,您可以将 $PYTHONPATH
设置为 subpkg
目录的路径,例如:
export PYTHONPATH="./subpkg"