我有这种奇怪的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
有谁知道我怎么做到这一点?
答案 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
个文件的树和内容?有了可用的数据,我很遗憾能够重现这个问题。