从另一个包中导入Python模块

4
我有一个脚本,具有以下结构。
./
    /foo
       __init__.py
    /bar
       __init__.py
    module.py

我希望能够在foo和bar包中同时使用module.py模块,但我找不到导入它的方法!

我可以将该模块放置在两个包中,但如果我需要进行任何更改,我必须在两个包中都进行修改。


1
import module?如果module.py所在的目录在路径上,那么它应该可以工作。如果不在路径上,那么你也无法导入你的包。 - user2357112
你的入口点是哪个文件? - Eric
3个回答

1

实际上,这有点棘手,假设我们有这样的结构:

├── bar
│   ├── __init__.py
│   └── some_bar.py
├── foo
│   ├── __init__.py
│   └── some_foo.py
└── something.py

some_foo.py中正确获取something.py中的对象的方法是添加:
# foo/some_foo.py
from something import some_module

然后在顶层目录下使用-m选项将some_foo作为模块运行,如下所示:

python -m foo.some_foo

something.py中添加一些打印语句来测试它,如果一切正常,在运行some_foo后,您应该会看到来自something.py的一些输出。请记住,您需要从顶层运行some_foo,而不是从foo目录运行。


为什么要将__init__.py与可能的顶级模块something.py放在一起?为什么你会建议在这种情况下使用import *?在这里不要创建__init__.py文件,也不要使用import * - jfs
something.py 不是一个包。from something import some_module 可能会引起误导(从技术上讲,你可以通过编程将 something.py 转换为一个包,但通常情况下,Python 包是以目录的形式创建的,比如在这个例子中的 foobar)。 - jfs

0

如果模块不在任何包中,则无需使用__init__.py文件。 - jfs

0
如果import foo可以工作,那么在您的情况下import module也应该可以工作。
如果您需要使用from toplevel import foo来导入foo,那么您可以使用from toplevel import module来导入module

module.py: from foo import testfoo\test.py: from . import module>python module.py - > ImportError: cannot import name module除了使用PYTHONPATH魔法外,没有办法使用from toplevel import module吗? - Alex Kroll
我同意只有包才需要顶级的__init__.py文件。 - Alex Kroll
@AlexKroll:module.py不在foo里面。你为什么认为from . import module会起作用呢?请使用import module代替。不要把信息放在评论中,而是更新你的问题 - jfs
这不是我的问题。但你写道:如果你需要使用 from toplevel import foo 导入 foo,那么你可以使用 from toplevel import module 导入 module。现在我相邻的问题是:如何使用 import from 语法从 foo\test.py 中指向 python 导入 toplevel 的 module? - Alex Kroll
1
@AlexKroll:在你的情况下,foo是顶层函数。这意味着你应该使用import module - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接