【问题标题】:Python 3: importing different python modules with same namePython 3:导入具有相同名称的不同 python 模块
【发布时间】:2020-01-26 19:06:41
【问题描述】:

我有几个相互独立编写的python 项目(例如a、b)。我想创建第三个项目(c),它使用这两个项目的例程,而不会对(a,b)的主要内容进行太多更改。

只要 (a.py, b.py) 在各自的项目文件夹中调用时仍然可以工作,对 (a, b) 中的导入语句进行微小更改即可。

这个问题有点类似于之前的帖子(Re-importing different python module with same name)但是:

  1. 我使用的是 Python 3,因此相对导入的工作方式似乎有所不同。

  2. 我想知道如何替换“from utils import *”行,如下例所示。

  3. 我在当前工作目录下有另一个 utils.py,它覆盖了项目 a 和 b 中的另一个 utils.py。


例如我的项目如下:

  • 一个
    • a.py
    • utils.py
  • b
    • b.py
    • utils.py
  • c
    • main.py
    • utils.py

a/a.py 的内容:

import utils
utils.hello()

a/utils.py 的内容:

def hello():
    print('hello from a')

b/b.py 的内容:

from utils import *
hello()

b/utils.py 的内容:

def hello():
print('hello from b')

main.py 的内容

import sys
sys.path.append('../a')
import a
sys.path.append('../b')
import b
import utils

utils.hello()

示例打印(我希望三行分别打印 a、b、c):

hello from c
hello from c
hello from c

在我看来,sys.path.insertsys.append 导入模块并不是很好的做法,并且随着项目的扩大,可能会使项目容易受到错误的影响。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    我使用的是 Python 3,因此相对导入不再有效。

    不知道你为什么会得出这个结论,但是:

    在 a.py 中:

    from .utils import hello # the . is important!
    hello()
    

    (在 b.py 和 c.py 中类似)

    打印所需的输出

    请注意,python 3 中的相对导入需要 from ... import ... 语法


    编辑:

    如果您的main.pyc/ 中,则需要更改导入路径,因为相对导入不能超出启动python 的工作目录(这就是如果导入a 或@987654327 会出现错误的原因@在c.

    您可以更改环境变量PYTHONPATH(请参阅norok's answer),也可以在main.py 中执行此操作:

    import sys
    sys.path.append('..')
    import b.b # no more errors!
    

    请注意,您仍然需要 a.pyb.pymain.py 中的 utils 的相对导入。

    【讨论】:

    • 这给了我一个错误ImportError: attempted relative import with no known parent package
    • 如果在控制台中输入,相对导入将不起作用。将其写入a.py,然后从控制台import a
    • 我将from .utils import hello 放入a.pyb.py 并在c 目录内从终端执行main.py
    • 哦,我没看到mainc/,我把我的放在根目录下。让我测试一下这个配置
    【解决方案2】:

    我认为您应该使用PYTHONPATH 变量以避免使用sys

    a/a.pyb/b.py的内容:

    import utils
    utils.hello()
    

    X/utils.pyX 的内容是abc 之一:

    def hello():
        print('hello from X')
    

    c/main.py的内容:

    import a.a
    import b.b
    
    import utils
    utils.hello()
    

    输出(运行时:export PYTHONPATH='$PYTHONPATH:<project_root>'; python main.py):

    hello from a
    hello from b
    hello from c
    

    【讨论】:

      【解决方案3】:

      将名为__init__.py 的空文件添加到文件夹a 和b 中。这会将这些文件夹标记为包。 https://docs.python.org/3/reference/import.html#regular-packages 然后(将文件夹添加到路径后)您应该能够将 a 导入为 import a.a,如果您愿意,可以将 a 的 utils.py 版本导入为 import a.utils

      【讨论】:

      • 或者,更确切地说,我只是测试了它,我可以确认__init__.py 文件在 python 3 中不是必需的
      猜你喜欢
      • 1970-01-01
      • 2019-07-03
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2017-10-28
      • 2012-05-17
      相关资源
      最近更新 更多