代码之家  ›  专栏  ›  技术社区  ›  Juan Leni

PyCharm中的子包和相对进口

  •  4
  • Juan Leni  · 技术社区  · 9 年前

    我正在使用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
    

    开始py公司

    from foo.bar2.mod2 import mod2_f
    mod2_f()
    

    def mod1_f():
        print "mod1_f"
    

    mod2.py

    from foo.bar1.mod1 import mod1_f
    
    def mod2_f():
        mod1_f()
        print "mod2_f"
    

    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
    

    现在,假设我将导入更改为

    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 回复  |  直到 9 年前
        1
  •  2
  •   Jean-François Fabre    9 年前

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

    那么从什么时候开始 你这样做

    from foo.bar2.mod2 import mod2_f
    

    python寻找一个 __init__.py ),它在目录结构中的位置太高。我认为它可以在IDE中工作,因为IDE将每个模块目录添加到pythonpath。但不是从命令行它没有。

    简单修复自 bar2 是与相同级别的目录 开始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来工作,或者只需删除 语法和do:

    import bar2.mod2.mod2_f
    
    推荐文章