Python找到一些,而不是所有自定义包

时间:2016-08-22 13:52:23

标签: python windows python-3.5

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

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

通过调用rootpython 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上中断?

编辑:说明程序的运行方式

2 个答案:

答案 0 :(得分:1)

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

我不是百分之百地确定如何解决这个名称冲突的具体细节,但看起来你似乎可以a)。让您的模块被现有模块覆盖(看起来可能在您的Windows案例中发生),或b)。覆盖现有模块,这可能会导致错误。似乎 b 通常会让人们兴奋起来。

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

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

答案 1 :(得分:0)

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

import root.parser.parser as p

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

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