首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDSW的相对进口

CDSW的相对进口
EN

Stack Overflow用户
提问于 2020-05-12 09:02:58
回答 1查看 546关注 0票数 1

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

代码语言:javascript
复制
/home/cdsw/my_project_v2.1
   |_>input
   |_>output
   |_>scr
      |_>__init__.py
      |_>main.py
      |_>utils
          |_>__init__.py
          |_>helpers.py

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

代码语言:javascript
复制
import sys

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

from helpers import bar

这很好,但这是一个错误的实践,因为如果版本更改,那么我需要更改所有使用路径的脚本。

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

代码语言:javascript
复制
from .utils.helpers import bar

但我发现了一个错误:

代码语言:javascript
复制
$ 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

要使其工作,我需要在架构或代码中更改什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-13 07:50:48

只管用

代码语言:javascript
复制
from utils.helpers import bar

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

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

这个句子的前半部分意味着您可以在引用目录的内容时使用绝对模块名,因为Python将在那里搜索模块。你不能使用相对进口,这是句后半句的结果。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61747742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档