【问题标题】:Subpackages and relative imports in PyCharmPyCharm 中的子包和相对导入
【发布时间】:2018-02-07 20:20:11
【问题描述】:

我正在使用 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 抱怨。为什么会有这些差异?

【问题讨论】:

  • 好吧,我没有使用 python 3。我现在使用的是 python 2
  • 我会说这是意料之中的:应该是from bar2.mod2 import mod2_f
  • 我已经尝试过了,但没有修复它..
  • edit 你的问题说明为什么这个解决方案不起作用,那么。鉴于您提供的清晰的项目结构,它应该工作。当然,由于您更改了名称,因此总是有可能出现拼写错误。但既然你知道它应该工作,我相信你会成功的。
  • 如果它不起作用,可能是因为您使用的是 python 3,而您认为您使用的是 python 2 :)

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2015-04-12
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    相关资源
    最近更新 更多