我正在尝试以交互方式运行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以使其工作吗?我是否以奇怪的方式组织我的代码?
答案 0 :(得分:3)
使用-m
选项See the documentation时。在您的情况下,这是包含foo
的目录。这样就可以正确解析bar
中的导入语句,即from foo import baz
。
不使用-m
选项the current directory will be added to the start of sys.path
时。在你的情况下,这是一个比以前更深的目录 - 它是目录/path/to/foo
本身。这不允许正确解析导入语句from foo import baz
。
我可以以不同方式调用python以使其工作吗?
这应该有效:
PYTHONPATH=. python foo/bar.py
我是否以奇怪的方式组织我的代码?
不是真的,但是你需要以某种方式将foo
的父目录放到sys.path
上。最好的方法是the first item in sys.path
is the directory containing the script that was used to invoke the Python interpreter然后“安装”您的代码:
pip install --editable .