本地导入的`python -m foo.bar`与`python foo / bar.py`

时间:2018-01-17 01:05:13

标签: python python-import

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

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

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

1 个答案:

答案 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 .