用作子模块时,python模块内导入中断

时间:2018-10-01 04:45:17

标签: python import

我有一个相当简单的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并将import语句更改为以下内容:

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的,以防万一有人跌入这里。

1 个答案:

答案 0 :(得分:0)

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