【问题标题】:relative imports on CDSWCDSW 上的相对进口
【发布时间】:2020-08-28 01:24:52
【问题描述】:

我有一个关于 CDSW 的项目,组织如下:

/home/cdsw/my_project_v2.1
   |_>input
   |_>output
   |_>scr
      |_>__init__.py
      |_>main.py
      |_>utils
          |_>__init__.py
          |_>helpers.py

在我当前的代码中,我使用sys.path.append 来执行我的导入。

import sys

sys.path.append("/home/cdsw/my_project_v2.1/src/utils/")

from helpers import bar

这很好用,但这是一个不好的做法,因为如果版本更改,那么我需要更改所有使用该路径的脚本。

我想用一些相对路径替换它:

from .utils.helpers import bar

但我得到了错误:

$ pwd
/home/cdsw
$ python3 my_project_v2.1/src/main.py 
Traceback (most recent call last):
  File "my_project_v2.1/src/main.py", line 1, in <module>
    from .utils.helpers import bar
ModuleNotFoundError: No module named '__main__.helpers'; '__main__' is not a package

我需要对架构或代码进行哪些更改才能使其正常工作?

【问题讨论】:

    标签: python-3.x relative-import cdsw


    【解决方案1】:

    随便用

    from utils.helpers import bar
    

    Python 命令行参数documentation 的简短摘录:

    如果脚本名称直接引用 Python 文件,则将包含该文件的目录添加到 sys.path 的开头,并将文件作为 __main__ 模块执行。

    句子的前半部分表示在引用目录内容时可以使用绝对模块名,因为 Python 会在那里搜索模块。您不能使用相对导入的事实是句子后半部分的结果。

    作为旁注,您也可以考虑在目录名称中省略版本号,或者更好的是,将您的代码直接放在/home/cdsw 中。后者可能听起来很奇怪,因为你永远不会在普通机器上这样做,但这里所有的东西都在一个容器中,实际上这就是你的代码应该在 CDSW 中组织的方式。您可以通过基于模板或 git URL 创建一个新项目来确认这一点——两者都会将代码直接放在主目录中。

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多