1

我有一个关于 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

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

4

1 回答 1

1

只需使用

from utils.helpers import bar

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

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

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

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

于 2020-05-13T07:50:48.617 回答