【问题标题】:Python relative imports with sys.path使用 sys.path 的 Python 相对导入
【发布时间】:2018-11-02 17:29:59
【问题描述】:

我有一个奇怪的 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 和导入一起使用:

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

我无法从utils.SomeClass 中删除utils

有谁知道我如何做到这一点?

【问题讨论】:

  • 你能试试from aaa.bbb import ccc,然后是from ccc import utils吗?只是好奇这是否能让你有所收获。
  • 或者from aaa.bbb import ccc.utils as utils
  • 您的sys.path 是什么样的?也许尝试预先挂起 /path/to/root/directory 而不是追加 - 是否有可能在 path 中有另一个模块 aaa.bbb 在您之前找到,并且可能缺少一些 __init__.py 文件或没有没有ccc
  • from aaa.bbb import ccc.utils as utils 不起作用,给出 Python 语法错误
  • from aaa.bbb import ccc 后跟 from ccc import utils 也不起作用:from ccc import utils ImportError: No module named ccc

标签: python import python-import sys


【解决方案1】:

这确实不是答案,但我无法将其放入评论中,更不用说任何理智的格式了。我很抱歉,但希望它仍然可以帮助我们到达某个地方。

我怀疑问题中的某处仍然缺少一些信息。我在/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")

如果我正确阅读描述应该足以复制行为。现在我尝试了你的两个 sn-ps:

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。我可以重现此问题(得到相同错误)的唯一方法是从 ccc/ 中删除 __init__.py,但其他语法也不起作用那么。

您能否发布__init__.py 文件的树和内容?不幸的是,有了可用的数据,我能够重现该问题。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2013-09-16
    • 2021-11-16
    • 1970-01-01
    • 2016-01-09
    相关资源
    最近更新 更多