我应该如何从另一个模块导入一个模块,其中第一个模块本身正在导入另一个模块?

问题描述 投票:0回答:1

我这里有3个相关文件,在这个目录中设置:

src/operator_precedence_high_roller_bot/
    parsing/
        command_parser.py
    high_roller.py
tests/test_high_roller/
    test_handle_gamble_start.py

command_parser.py的内容并不是非常相关,因为重要的部分是它需要导入到High_Roller中。本质上,high_roller.py 是当需要解析命令时调用 command_parser.py 的代码。


high_roller.py

从解析文件夹中的command_parser.py导入CommandParser

... from parsing.command_parser import CommandParser ...


test_handle_gamble_start.py

import pathlib, sys, os ROOT_PATH = pathlib.Path(__file__).parents[2] sys.path.append(os.path.join(ROOT_PATH, 'src')) print(sys.path) from operator_precedence_high_roller_bot import high_roller
我想出了几种不同的方法将 high_roller.py 导入 test_handle_gamble_start.py (我通过用 print("here") 语句替换所有原始代码来验证这一点,并且在运行 test_handle_gamble_start 时,它只是打印“here”) .

但是当我将行

from parsing.command_parser import CommandParser 添加回 high_roller.py 并尝试运行 test_handle_gamble_start.py 时,我收到以下错误: ModuleNotFoundError:没有名为“parsing”的模块

据我所知,我需要做一些尚未完成的事情来将解析文件夹显示给 test_handle_gamble_start.py。我为此尝试了几种不同的方法。

首先,我尝试在相关目录中添加 _

init_.py 文件,但这没有帮助。然后我尝试将解析目录的路径添加到test_handle_gamble_start.py中的sys.path中,但没有做任何事情。然后我尝试将其添加到 high_roller.py 中的 sys.path 中,但这也没有帮助。最后,我尝试将operator_precedence_high_roller_bot放入一个包中,我认为它也没有做任何事情。

包裹在这里:

https://pypi.org/project/operator-precedence-high-roller-bot/

github 存储库在这里,如果我没有详细说明解析功能的语义,我可以有一个自述文件:

https://github.com/carsonrobertsg2019/operator-precedence-high-roller/

python unit-testing import discord file-management
1个回答
0
投票
我花了更多时间解决了这个问题。作为解决方案的一部分,我更新了文件结构,如下所示:

operator_precedence_high_roller/ parsing/ command_parser.py high_roller.py tests/test_high_roller/ test_handle_gamble_start.py
import pathlib
import sys
import os
ROOT_PATH = pathlib.Path(__file__).parents[1]
sys.path.append(os.path.join(ROOT_PATH, ''))
from operator_precedence_high_roller.parsing.command_parser import CommandParser
上面的

high_roller.py基本上将项目目录添加到path.lib中,以便测试python文件可以看到导入的模块,如CommandParser。

import pathlib import sys import os ROOT_PATH = pathlib.Path(__file__).parents[2] sys.path.append(os.path.join(ROOT_PATH, '')) from operator_precedence_high_roller import high_roller
上面的 

test_handle_gamble_start.py 与 high_roller.py 中的 sys.path 操作相同,这次需要“parents[2]”而不是“parents[1]”,因为测试 python 脚本在目录比 high_roller

© www.soinside.com 2019 - 2024. All rights reserved.