代码之家  ›  专栏  ›  技术社区  ›  Felix

无法导入同一目录和包中的模块

  •  0
  • Felix  · 技术社区  · 6 年前

    我用的是 from . import module 语句执行此操作:将本地模块导入我的脚本。脚本和模块位于同一文件夹中。

    # module.py
    def foo():
        print('Foo!')
    
    # script.py
    from . import module
    module.foo()
    
    > ImportError: cannot import name 'module'
    

    这应该很容易,而且 import module 确实有效,但是 this answer 建议大家应该这样做,我把陈述改成了前一种形式。

    最终目标 就是要有一个包,我可以从中使用东西,但也要有可执行脚本,在包内导入该包的其他部分。显然,经过几天的研究和一些问题,我仍然不太了解进口和包装机械。

    这可能是原因:

    • 导入语句在2.7和3.x中不同,我使用的是3.6,问题是在2.7上
    • 包内的相对导入不同(文件夹 __init__.py )
    • 工作目录不同或文件夹不在 sys.path

    有一个 __init__ 至少在pycharm中的新项目中,文件没有什么不同。此外,工作目录被设置为源的文件夹,它位于 path 是的。

    我错过什么了吗或者更确切地说, 实现最终目标中描述的功能的正确方法是什么? 非常感谢您的帮助!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Felix    5 年前

    写下这个答案后,我意识到用 pip install -e . 使用绝对进口。所以即使在一个包裹里 from package.sub.module import thing 是的。这使得重构更加容易,而且不需要操作模块变量或 sys.path 是的。


    当直接运行脚本时,python会考虑名称(一个特殊的变量, __name__ )那剧本的 "__main__" 是的。如果是导入,则将名称设置为模块的名称。在后一种情况下,相对进口是可以的。但是 import 实际上是看 _姓名__ 还有另一个特殊变量, __package__ ,这是 None 对于已执行的脚本,但是导入模块的模块路径,例如。 parent.sub 是的。

    搜索的变量是… 鼓槌 ...

    __package__ + '.' + __name__
    

    秘密成分在操纵 _包装__ 以下内容:

    # script.py
    __package__ = 'package_name'   # or parent.sub.package
    from . import module
    

    这让Python了解您 在包中,即使脚本是直接执行的。但是,顶级文件夹需要在 搜索路径 包名必须反映目录结构。

    this very comprehensive answer 关于相对进口的话题。