【问题标题】:python intra-module import breaks when used as submodule用作子模块时,python模块内导入中断
【发布时间】:2018-10-01 04:45:16
【问题描述】:

我有一个相当简单的 python 包。单独使用时,它似乎工作正常。它看起来像这样:

my_script/
    __init__.py
    my_script.py
    my_script_helper.py
    data/
        my_data.csv

__init__.py 为空白。

my_script.py 看起来像这样:

from my_script_helper import *

def do_thing(x):
    return helper(x)

my_script_helper.py 看起来像这样:

def helper(y):
    return y + 1 

我可以运行导入 my_script.py 的测试脚本并获得预期的输出。据我所知,单独使用 my_script 包可以正常工作。因此,我将所有内容都粘贴到 GitHub 上的存储库中,并将其作为子模块导入到另一个项目中。

另一个项目现在看起来像这样:

my_big_project/
    my_script/
        __init__.py
        my_script.py
        my_script_helper.py
        data/
            my_data.csv
    my_big_project.py

但是,现在 my_script.py 中的 import 语句给了我一个未解决的引用错误。如果我进入 my_script.py 并将导入语句更改为以下内容:

from my_script.my_script_helper import *

然后就可以了。当然,该声明单独使用时会破坏包装。而且我认为我可能不应该在这样的子模块中闲逛。

我是一个 Python 和编程新手,在导入、命名空间和 __init__ 方面遇到了困难。如果有人能指出我应该如何在这里构建我的导入的正确方向,我将不胜感激。

编辑: 在把我的头撞到墙上之后,我发现有效的解决方案是将以下内容添加到 my_script.py:

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

我觉得这可能不是正确的方法,但到目前为止它运行良好。这是针对 python 3.6.1 的,以防有人在这里绊倒。

【问题讨论】:

    标签: python import


    【解决方案1】:

    因为最初该软件包是独立的,并且对您来说效果很好。现在您已经在另一个项目中使用了该包,您应该使用绝对路径,这就是您遇到问题的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多