PyCharm中的子包和相关进口

时间:2017-08-30 07:58:40

标签: python pycharm python-import python-2.x

我正在使用python 2:

python --version
Python 2.7.13 :: Continuum Analytics, Inc.

我有以下项目结构:

.
└── foo
    ├── bar1
    │   ├── __init__.py
    │   └── mod1.py
    ├── bar2
    │   ├── __init__.py
    │   └── mod2.py
    ├── __init__.py
    └── start.py

start.py

from foo.bar2.mod2 import mod2_f
mod2_f()

mod1.py

def mod1_f():
    print "mod1_f"

mod2.py

from foo.bar1.mod1 import mod1_f

def mod2_f():
    mod1_f()
    print "mod2_f"

如果我从IDE运行start.py,那么工作正常。

但是使用这样的东西:

python ./foo/start.py

结果

Traceback (most recent call last):
  File "./foo/start.py", line 1, in <module>
    from foo.bar2.mod2 import mod2_f
ImportError: No module named foo.bar2.mod2

现在,让我们说我将导入更改为

start.py

from bar2.mod2 import mod2_f
mod2_f()

mod2.py

from bar1.mod1 import mod1_f

def mod2_f():
    mod1_f()
    print "mod2_f"

现在可以从命令行python ./foo/start开始工作 然而,PyCharm抱怨道。为什么会有这些差异呢?

1 个答案:

答案 0 :(得分:2)

foo是包含所有内容的目录,包括start.py

所以当你从start.py开始这样做时

from foo.bar2.mod2 import mod2_f

python查找foo模块(foo 模块,因为它包含__init__.py),这在您的目录结构中太高了。我认为它适用于IDE,因为IDE将每个模块目录添加到pythonpath。但不是来自命令行,它没有。

简单修复,因为bar2是与start.py相同级别的目录:

from bar2.mod2 import mod2_f

请注意from在python 3中的工作方式不同。请参阅ImportError on python 3, worked fine on python 2.7,这可能是PyCharm在修复导入行时抱怨的原因。您应该配置PyCharm,使其使用Python 2而不是Python 3才能工作,或者只是完全删除from语法并执行:

import bar2.mod2.mod2_f