【问题标题】:Python finding some, not all custom packagesPython 找到了一些,不是所有的自定义包
【发布时间】:2016-12-29 02:43:20
【问题描述】:

我有一个文件结构如下的项目:

root/
    run.py
    bot/
        __init__.py
        my_discord_bot.py
    dice/
        __init__.py
        dice.py
        # dice files
    help/
        __init__.py
        help.py
        # help files
    parser/
        __init__.py
        parser.py
        # other parser files

程序在root 目录中通过调用python run.py 运行。 run.py 导入 bot.my_discord_bot,然后使用那里定义的类。

文件bot/my_discord_bot.py 有以下导入语句:

import dice.dice as d
import help.help as h
import parser.parser as p

在 Linux 上,所有三个 import 语句都能正确执行。在 Windows 上,前两个似乎执行得很好,但在第三个我被告知:

ImportError: No module named 'parser.parser'; 'parser' is not a package

为什么它会在第三个 import 语句中中断,为什么它只在 Windows 上中断?

编辑:阐明程序是如何运行的

【问题讨论】:

  • Linux 和 Windows 上的 Python 版本是否可能不同?如果是这样,您是否支持两者?
  • 您提到前两个导入“似乎执行良好”,但如果您注释掉 import parser.parser as p 行,其他导入是否成功?另外,您的root/ 中是否需要__init__.py
  • @elethan 其他导入仍然成功,但有问题的导入已被注释掉。如果我将__init__.py 添加到我的根目录,我也不会得到任何更改。
  • PYTHONPATH 环境变量中的“根”目录吗?
  • 另外,三重检查parser/ 中的__init__.py 没有发生任何事情,并且您没有隐藏内置或第三方库。例如,如果我打开一个 Python 3 解释器并执行 import parser 它是成功的,即使我自己还没有创建一个名为 parser 的包。也许只是测试重命名包是否可以解决问题。我知道它在 Linux 上成功了,但也许你的 Windows 安装上有另一个名为 parser 的软件包,但 Linux 上没有。 python-notes.curiousefficiency.org/en/latest/python_concepts/…

标签: python windows python-3.5


【解决方案1】:

确保您的 parser 没有隐藏内置或第三方包/模块/库。

我不能 100% 确定如何解决此名称冲突的具体细节,但您似乎可以 a)。让您的模块被现有模块覆盖(这似乎可能发生在您的 Windows 案例中),或者 b)。覆盖现有模块,这可能会导致错误。似乎 b 是人们经常绊倒的原因。

如果您认为您的某个模块可能会发生这种情况(使用 parser 这样的名称似乎很有可能),请尝试重命名您的模块。

有关更多详细信息和更常见的 Python“导入陷阱”,请参阅 this very nice article

【讨论】:

    【解决方案2】:

    将run.py放在根文件夹外,这样你就可以在根文件夹旁边有run.py,然后在根文件夹内创建__init__.py,并将导入更改为:

    import root.parser.parser as p
    

    或者只是重命名您的解析器模块。

    无论如何,你应该小心命名,因为你总有一天会弄乱自己的东西。

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 2020-08-07
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2021-04-24
      相关资源
      最近更新 更多