【问题标题】:I can't import modules from other folders我无法从其他文件夹导入模块
【发布时间】:2019-04-10 10:03:42
【问题描述】:

我对 Python 世界有点陌生。我正在使用 Python3,并且在导入方面遇到了困难。

我在 Windows 上使用 PyCharm 编写应用程序。在我切换到 Linux 和 VS Code 之前,一切都在项目中进行。

现在我不能使用绝对导入来从同一个项目中的其他包导入模块。

例如,我想从模块卡中导入所有可用的卡类型。

我测试了课程,一切正常。我只是在导入的东西上遇到这个问题。

The project structure:

/
|-cards
    |-__init__.py
    |-card.py
    |-monster_card.py
    |-spell_card.py
    |-trap_card.py
    |-ritual_card.py
|-deck
    |-__init__py
    |-deck.py
|-system

# This is the code in __init__.py in cads package
from . trap_card import TrapCard
from . spell_card import SpellCard
from . ritual_card import RitualCard
from . monster_card import MonsterCard

__all__ = [TrapCard, SpellCard, RitualCard, MonsterCard]

# The following line, for example, does not work from inside another package
# I'm trying to import the modules in cards from deck
from cards import TrapCard, MonsterCard, SpellCard, RitualCard

当我尝试从其他文件夹导入包时,我收到以下错误消息:

Traceback(最近一次调用最后一次):

文件“/root/git-repos/Yu-Gi-Oh/decks/deck.py”,第 3 行,在 从卡片导入 TrapCard、MonsterCard、SpellCard、RitualCard ModuleNotFoundError: 没有名为“卡片”的模块

【问题讨论】:

  • 您是指from . trap_card import TrapCard 还是from .trap_card import TrapCard?如果您要使用相对导入,则不应有空格。
  • 我的意思是从 .trap_card 导入 TrapCard。谢谢你。我修复了相对导入,但仍然无法从其他包中导入模块。

标签: python-3.x python-import


【解决方案1】:

当您调用import * 时,python 从sys.path 搜索模块。在调用 import stmt 之前,您需要将根目录添加到 sys.path

对于您的情况,您的根目录是 /

喜欢:

import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))

from cards import *

其他方式

将文件__init__.py 添加到您的根目录中,使其成为一个模块。然后把from cards import *改成from .cards import *

【讨论】:

  • 非常感谢。你的解决方案奏效了。这里的问题是我不明白它为什么有效。所以现在 'cards' 目录被添加到 sys.path 中,但是对于这个问题还有其他更简单的解决方法吗?如果没有,猜想我需要创建某种初始化文件,以便将一些目录添加到 sys.path 以使其全部工作。我在 Windows 环境下工作,我没有遇到这个问题。为什么?这真的很令人困惑。如果您提出一些阅读建议,我将不胜感激。谢谢。
  • 谢谢。我测试了这两种情况,它们运行良好。
猜你喜欢
  • 1970-01-01
  • 2019-05-19
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多