PyCharm 中的子包和相关导入
Subpackages and relative imports in PyCharm
我正在使用 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"
如果我 运行 start.py 来自 IDE 一切正常。
但是使用这样的东西:
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 抱怨道。为什么会有这些差异?
foo
是包含所有内容的目录,包括 start.py
所以当你从 start.py
开始这样做时
from foo.bar2.mod2 import mod2_f
python 查找 foo
模块(foo
是 模块,因为它包含 __init__.py
),这也是在你的目录结构中很高。我想它在 IDE 下工作,因为 IDE 将每个模块目录添加到 python 路径。但不是从命令行它没有。
简单修复,因为 bar2
是与 start.py
处于同一级别的目录:
from bar2.mod2 import mod2_f
请注意 from
在 python 3 中的工作方式不同。参见 ,这可能就是 PyCharm 在修复导入行时抱怨的原因。您应该配置 PyCharm 以便它使用 Python 2 而不是 Python 3 才能正常工作,或者干脆放弃 from
语法并执行:
import bar2.mod2.mod2_f
我正在使用 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"
如果我 运行 start.py 来自 IDE 一切正常。
但是使用这样的东西:
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 抱怨道。为什么会有这些差异?
foo
是包含所有内容的目录,包括 start.py
所以当你从 start.py
开始这样做时
from foo.bar2.mod2 import mod2_f
python 查找 foo
模块(foo
是 模块,因为它包含 __init__.py
),这也是在你的目录结构中很高。我想它在 IDE 下工作,因为 IDE 将每个模块目录添加到 python 路径。但不是从命令行它没有。
简单修复,因为 bar2
是与 start.py
处于同一级别的目录:
from bar2.mod2 import mod2_f
请注意 from
在 python 3 中的工作方式不同。参见 from
语法并执行:
import bar2.mod2.mod2_f