“Python -m foo.bar”与“Python foo/bar.py”用于本地导入



我正在尝试以交互方式运行python文件。该文件导入其他本地模块。例如,我有foo/bar.pyfoo/baz.py.我想以交互方式运行foo/bar.pyfoo/bar.pyfrom foo import baz.

foo的父目录中,我可以运行python -m foo.bar,并且baz的导入工作正常。但是当我想与python -i foo/bar.py交互运行时,导入不再有效(如果我这样做,python foo/bar.py也是如此(。

为什么?我可以以不同的方式调用 python 来让它工作吗?我是否以奇怪的方式组织我的代码?

使用 -m 选项时,当前目录将添加到 sys.path 的开头。 在您的情况下,这是包含foo的目录。 这允许 bar 中的导入语句,即 from foo import baz ,要正确解决。

不使用 -m 选项时,sys.path的第一项是包含用于调用 Python 解释器的脚本的目录。 在您的情况下,这比以前更深 - 它是目录本身/path/to/foo。 这不允许正确解析导入语句from foo import baz

我可以以不同的方式调用 python 来让它工作吗?

这应该有效:

PYTHONPATH=. python foo/bar.py

我是否以奇怪的方式组织我的代码?

不是真的,但您需要以某种方式将foo的父目录放到sys.path上。 最好的方法是编写一个setup.py文件,然后使用以下命令"安装"代码:

pip install --editable .

最新更新