我正在尝试以交互方式运行python文件。该文件导入其他本地模块。例如,我有foo/bar.py
和foo/baz.py
.我想以交互方式运行foo/bar.py
,foo/bar.py
我from 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 .