Python相对导入与sys.path

时间:2018-05-23 16:24:36

标签: python import python-import sys

我有这种奇怪的Python导入,但我无法使用其他讨论中的任何建议。

我目前正在向其他人的模块添加一个小脚本,因此我无法更改文件结构或任何现有代码,这会让事情变得困难。

以下是包含一堆类的python脚本示例:

/path/to/root/directory/aaa/bbb/ccc/utils.py

当前开发人员按如下方式导入:

from aaa.bbb.ccc import utils
utils.SomeClass.someMethod()

树中的所有目录都有一个__init__.py文件

现在我想在外部调用模块,如下所示:

import sys
sys.path.append('/path/to/root/directory')
from aaa.bbb.ccc import utils
utils.SomeClass.someMethod()

这不起作用,并给出以下错误:

from aaa.bbb.ccc import utils
ImportError: No module named ccc

但是,稍微更改导入确实有效:

import sys
sys.path.append('/path/to/root/directory')
from aaa.bbb.ccc.utils import *
SomeClass.someMethod()

我不明白为什么第二个工作而不是第一个工作。同样,我无法更改现有代码,因此以下2个语句必须与我的sys.path.append和imports一起使用:

from aaa.bbb.ccc import utils
utils.SomeClass.someMethod()

我无法从utils

中删除utils.SomeClass

有谁知道我怎么做到这一点?

1 个答案:

答案 0 :(得分:0)

这真的不是一个答案,但我无法将其纳入评论中,更不用说任何理智的格式了。我的道歉,但它仍然可以帮助我们到达某个地方。

我怀疑问题中某处仍然遗漏了一些信息。我在/tmp/so/xxx下设置了以下树:

.
└── aaa
    ├── __init__.py
    └── bbb
        ├── __init__.py
        └── ccc
            ├── __init__.py
            └── utils.py

__init__.py个文件为空,utils.py表示:

class SomeClass:
    @staticmethod
    def someMethod():
        print("FOO")

如果我正确阅读说明应该足以复制行为。现在我尝试你的两个片段:

import sys
sys.path.append("/tmp/so/xxx")
from aaa.bbb.ccc import utils
utils.SomeClass.someMethod()

并运行:

$ python test1.py 
FOO

第二个:

import sys
sys.path.append("/tmp/so/xxx")
from aaa.bbb.ccc.utils import *
SomeClass.someMethod()

也运行:

$ python test2.py 
FOO

我尝试过Python 3.6.5和2.7.15。结果相同。

根据您的输出,我假设您正在运行Python 2.我可以重现此问题的唯一方法(得到相同的错误)是从__init__.py删除ccc/,但另一种语法那时候不行。

您是否可以发布__init__.py个文件的树和内容?有了可用的数据,我很遗憾能够重现这个问题。