从主模块或直接导入

问题描述 投票:0回答:1

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
块,但这看起来很黑客(甚至比在子模块中包含快速和肮脏的测试还要多)。

python package
1个回答
0
投票

首先,如果

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"
© www.soinside.com 2019 - 2024. All rights reserved.