绝对导入conda env

时间:2019-12-25 02:28:13

标签: python conda

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

  • 项目/
    • package_1 /
      • __ init __。py
      • file_1.py
      • subpackage_1 /
        • run.py

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

2 个答案:

答案 0 :(得分:1)

其中一种方法是将这段代码添加到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

答案 1 :(得分:0)

摘要

您可以通过相对导入或绝对导入(如果您重构项目)来完成所需的工作。修改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)而不是子包中。

示例:

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上通常会实现与相对导入类似的效果,但是以后的import语句会失去语义。