【问题标题】:Absolute import in conda envconda env 中的绝对导入
【发布时间】:2020-09-12 23:48:00
【问题描述】:

我在使用 conda env 时遇到了绝对导入的问题。这是我的项目的结构。

  • 项目/
    • package_1/
      • __init__.py
      • file_1.py
      • 子包_1/
        • run.py

package_1.subpackage_1.run.py 中有一个绝对导入import package_1.file_1。但是,当我在 package 文件夹中运行 python package_1/subpackage_1/run.py 时,出现错误: ModuleNotFoundError: No module named 'package_1'。我试图打印sys.pathproject.package_1.subpackage_1sys.path 中,但我运行命令的文件夹project 不在。我试图在PATHPYTHONPATH 中添加project,但它在 conda env 中不起作用。有谁知道如何解决这一问题?谢谢!!!

【问题讨论】:

    标签: python conda


    【解决方案1】:

    其中一种方法是将目录添加到您的sys.path,并在run.py 顶部使用此代码

    import sys
    import os
    
    sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'package_1'))
    

    然后在run.py中改行

    import package_1.file_1
    

    import file_1
    

    现在python可以直接导入file1,因为它的目录在路径上。

    【讨论】:

    • 此解决方案虽然功能强大,但不再像 OP 所要求的那样绝对导入。
    • @Aposhian - OP 问题的最后几行是I tried to add project in PATH or PYTHONPATH, but it doesn't work in conda env. Does anyone know how to fix this? - 此解决方案解决了此问题。我没有看到 OP 在哪里指定解决方案需要绝对导入。
    • 公平。但是,我理解(可能不正确)OP 想要进行绝对导入,并认为将包添加到 PYTHONPATH 可以解决这个问题。 Python Style Guide 中首选绝对导入。
    • @Aposhian - 在这种情况下。我不认为反对票是合理的。
    • 公平。但是,在进行编辑之前,我不能撤回我的投票,所以我已经提交了。
    【解决方案2】:

    总结

    您可以使用相对导入来完成您想要的事情,或者如果您重组项目,则可以使用绝对导入。修改您的 sys.pathPYTHONPATH 不应该是您的首选解决方案。如果你真的想要全球可用性,你可以使用conda 安装你的本地包。

    选项 1:Relative Imports

    如果您希望能够直接在子模块中运行文件(即python package_1/subpackage_1/run.py),那么您应该考虑使用相对导入

    示例:

    project/
      package_1/
        __init__.py
        file_1.py
        subpackage_1/
          __init__.py
          run.py
    
    # run.py
    
    import ..file_1
    
    

    选项 2:绝对导入

    如果您想使用绝对导入,那么您的入口点(您运行的脚本)应该位于顶层 (package_1) 而不是子包内。 p>

    示例:

    project/
      package_1/
        __init__.py
        run.py
        file_1.py
        subpackage_1/
          __init__.py
          stuff.py
    
    # run.py
    
    import package_1.subpackage_1.stuff
    
    stuff.run()
    
    # stuff.py
    
    import package_1.file_1
    

    选项 3:使用 conda 安装本地包

    一旦你configure your package correctly 你应该可以简单地运行

    conda install .
    

    它将像安装已发布的软件包一样安装您的本地软件包。对于您的需求,这可能是多余的。

    为什么不修改PYTHONPATHsys.path

    如果您依赖 PYTHONPATH 上的本地包路径,则每次移动项目或将其复制到新计算机上时。

    在代码中将条目附加到 sys.path 通常会实现与使用相对导入所做的类似的效果,但稍后的导入语句会失去语义。

    【讨论】:

      猜你喜欢
      • 2020-01-24
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多